对象散布在新数组内
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,同意并更新了答案。谢谢指正。以上是关于对象散布在新数组内的主要内容,如果未能解决你的问题,请参考以下文章