将元素从一个对象添加/合并到数组内的另一个对象
Posted
技术标签:
【中文标题】将元素从一个对象添加/合并到数组内的另一个对象【英文标题】:Add/Merge element from from one Object to another Object inside array 【发布时间】:2019-05-03 12:09:27 【问题描述】:我的异步函数中有以下代码
async function test ()
try
const aucs = await auctions.find(owner: 'owner', place: 'place').limit(15);
const item = await Promise.all(aucs.map(async aucs =>
const map = await items.find(id: aucs.item);
return map[0]
));
--->we are here [1]
catch (err)
console.log(err);
test();
还有点 [1]
我有两个可用的数组,其中包含另一个对象(都是来自 Mongo 的响应),它们是:
aucs = [ _id: 5c00faa4936359120ceb3632,
auc: 177215422,
item: 130251,
price: 26000000,
lastModified: 1543567955000,
date: 2018-11-30T08:53:56.290Z,
__v: 0 ,
_id: 5c00faa4936359120ceb363f,
auc: 177215440,
item: 130251,
price: 26000000,
lastModified: 1543567955000,
date: 2018-11-30T08:53:56.290Z,
__v: 0 ,... ]
和
item = [ _id: 5bcd8a6134cdd1223cd3239b,
id: 130251,
name: 'TEST_NAME_1',
__v: 0 ,
_id: 5bcd8a6134cdd1223cd3239b,
id: 130252,
name: 'TEST_NAME_2',
__v: 0 ,...]
我想添加到 aucs[i]
aucs 中的每个元素,item[i].name
(name: 'TEST_NAME_1'
)
喜欢:
combined = [ _id: 5c00faa4936359120ceb3632,
auc: 177215422,
item: 130251,
name: 'TEST_NAME_1',
price: 26000000,
lastModified: 1543567955000,
date: 2018-11-30T08:53:56.290Z,
__v: 0 ,...]
我正在尝试将for
循环与auc[i].name = item[i].name
一起使用或使用aucs.push()
,但由于某些未知原因,它对我不起作用。
我收到.push is not a function
的错误,而 for 循环没有添加任何内容。那么也许有人有任何想法?
注意:1
实际上解决了 item 的一个问题,mongo 在数组内返回数组,如[ [ ... ] ]
,所以我应该使用 return map[0] 来修复它。
注意:2
根据 typeof,aucs 和 item 都是对象,并且有 .length 选项(它们的长度相同,应该一直都是。所以它们不是承诺
注意:3
let merged = ...aucs, ...item;
回复我
'0': _id: 5bcd8a6134cdd1223cd3239b,
id: 130251,
name: 'JewelCraft',
icon: 'inv_jewelcrafting_70_jeweltoy',
stackable: 1,
isAuctionable: true,
__v: 0 ...
但不是我需要的
【问题讨论】:
我建议不要在 cmets 中添加信息,而是更新问题本身(使用“编辑”)。 【参考方案1】:如果我理解正确,目标是创建一个新的 aucs
集合,就像找到的集合一样,每个更新都包含来自 item
集合的项目名称,其中项目具有匹配的 id。
let aucs = [ _id: "5c00faa4936359120ceb3632",
auc: 177215422,
item: 130251,
price: 26000000,
lastModified: 1543567955000,
date: "2018-11-30T08:53:56.290Z",
__v: 0 ,
_id: "5c00faa4936359120ceb363f",
auc: 177215440,
item: 130251,
price: 26000000,
lastModified: 1543567955000,
date: "2018-11-30T08:53:56.290Z",
__v: 0 ];
item = [ _id: "5bcd8a6134cdd1223cd3239b",
id: 130251,
name: 'TEST_NAME_1',
__v: 0 ,
_id: "5bcd8a6134cdd1223cd3239b",
id: 130252,
name: 'TEST_NAME_2',
__v: 0 ];
// create a new collection of aucs modified to include the names of matching items
let combined = [];
aucs.forEach(auc =>
let combinedAuc = Object.assign(, auc);
combined.push(combinedAuc);
let matchingItem = item.find(i => auc.item === i.id);
if (matchingItem) combinedAuc.name = matchingItem.name
);
console.log(combined)
【讨论】:
可以不使用underscore
吗?似乎它工作正常,但我正在尝试不添加模块。那么_.method
是否代表array.prototype
?
编辑为不带下划线显示。这对于其他东西来说也是一个有用的库。【参考方案2】:
如果你在这里使用一些聚合技巧会更好更快
auctions.aggregate([
"$match": "owner": "owner", "place": "place" ,
"$lookup":
"from": "items",
"let": "item": "$item" ,
"pipeline": [
"$match": "$expr": "$eq": ["$id", "$$item"]
],
"as": "item"
,
"$limit": 15
])
【讨论】:
它适用于两个系列吗?我同时使用了itmes
和auctions
。如我所见,这里只有auctions
收藏。
是的,它会起作用的。请参阅 $lookup
聚合中的 from
部分。你可以在那里看到items
。它将带来与id
匹配的所有items
你应该阅读更多关于它的信息here以上是关于将元素从一个对象添加/合并到数组内的另一个对象的主要内容,如果未能解决你的问题,请参考以下文章