将元素从一个对象添加/合并到数组内的另一个对象

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 
])

【讨论】:

它适用于两个系列吗?我同时使用了itmesauctions。如我所见,这里只有auctions 收藏。 是的,它会起作用的。请参阅 $lookup 聚合中的 from 部分。你可以在那里看到items。它将带来与id匹配的所有items 你应该阅读更多关于它的信息here

以上是关于将元素从一个对象添加/合并到数组内的另一个对象的主要内容,如果未能解决你的问题,请参考以下文章

将数组中对象的字段添加到同一数组中对象的另一个字段MongoDB

vue合并两个对象

将对象添加到java mongodb中的数组

2018.07.22 数组

如何填充数组内的对象和猫鼬中的另一个数组中的所有用户字段

如何从对象数组中获取具有属性的列表,除非它包含具有特定值的另一个项目?