对象散布在新数组内

Posted

技术标签:

【中文标题】对象散布在新数组内【英文标题】:Object spread inside of new array 【发布时间】:2021-06-03 21:10:36 【问题描述】:

我有一个 Node.js 程序,它使用 Mongo Atlas 搜索索引并利用 MongoDB 驱动程序中的 Aggregate 函数。为了进行搜索,用户将在 URL 的查询参数中传递搜索查询。话虽如此,我正在尝试根据查询参数是否存在来构建搜索对象。为了构建搜索对象,我目前正在使用对象扩展语法和参数短路,如下所示:

const mustObj = 
  ...(query.term && 
    text: 
      query: query.term,
      path: ['name', 'description', 'specs'],
      fuzzy: 
        maxEdits: 2.0,
      ,
    ,
  )

这是一个缩短的版本,因为有更多的参数,但你懂的。

在 MongoDB 搜索查询中,如果您有多个必须满足特定条件的参数,则必须将它们包含在名为 must 的数组中,如下所示:


  $search: 
    compound: 
       must: [],
    ,
  ,

因此,为了包含我的搜索参数,我必须首先使用 Object.keys 将我的 mustObj 转换为对象数组并将它们映射到数组,然后将搜索“必须”数组分配给我已经创建,像这样:

const mustArr = Object.keys(mustObj).map((key) => 
  return  [key === 'text2' ? 'text' : key]: mustObj[key] ;
);
searchObj[0].$search.compound.must = mustArr;

我想要做的是,而不是创建 mustObj 然后循环整个事情来创建一个数组,而是使用我在创建对象。

我尝试了以下代码,但无济于事。我收到“对象不可迭代”错误:

const mustArr = [
  ...(query.term && 
    text: 
      query: query.term,
      path: ['name', 'description', 'specs'],
      fuzzy: 
        maxEdits: 2.0,
      ,
    ,
  )
]

总之,我的问题是,我所问的是否可能?如果有,怎么做?

【问题讨论】:

a=[...()] 是不可能的,但a=[...([])] 是可能的 我认为您可以使用简单的 for 循环并将您的对象推送到 mustArr 你可以试试这样:mustArr = [query.term? text: query: "" : ],不需要解构 @ChauGiang 第一条评论让我快到了。唯一的问题是,如果缺少其中一个参数,我会得到“未定义不可迭代”。不幸的是,我不能使用三元运算符,因为如果我发送一个空白对象,mongo 会抛出一个错误。 问题中没有显示解构,它只是扩展语法。 【参考方案1】:

根据@VLAZ 评论更正:

spread 与数组[...(item)]item 必须是数组(可迭代)。

当你使用短路时,item 如下,

 true && [] ==> will be `[]` ==> it will work 
 false && [] ==> will be `false` ==> wont work (because false is not array)

尝试一些类似的东西(类似于@Chau 的建议)

const mustArr = [
  ...(query.term ? [
    text: 
      query: query.term,
      path: ['name', 'description', 'specs'],
      fuzzy: 
        maxEdits: 2.0,
      ,
    ,
  ] : [])
]

【讨论】:

啊啊啊!我知道了。因为我正在解构数组,所以它不会返回一个空白数组。完美的!那行得通!非常感谢你们! "用数组[...(item)]解构时,item必须是数组。" 1.这不是解构而是传播。 2. item 可以是任何可迭代的,而不仅仅是一个数组。 @VLAZ,同意并更新了答案。谢谢指正。

以上是关于对象散布在新数组内的主要内容,如果未能解决你的问题,请参考以下文章

比较两个对象数组并在新数组中返回匹配值

映射两个对象数组,匹配属性并将特定信息存储在新数组中

让Spring不再难懂-aop篇

如何解析 JSON 数据对象内的数组内的数组?

C MPI 中的结构散布数组

ES6 数组内对象去重