Добавить / объединить элемент из одного объекта в другой объект внутри массива - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть следующий код в моей асинхронной функции

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 и за цикл ничего не добавил.Так, может быть, у кого-то есть идеи?

Примечание: 1

фактически решает одну проблему с элементом, Монго возвращает мне массив внутри массива, как [ [ { ...} ] ], поэтому я должен использовать returnкарта [0], чтобы исправить это.

Примечание: 2

и aucs, и item являются объектами в соответствии с typeof и имеют опцию .length (они имеют одинаковую длину и должны быть все время.Таким образом, они не обещания

Примечание: 3

let merged = {...aucs, ...item}; возвращает меня

{ '0': { _id: 5bcd8a6134cdd1223cd3239b,
     id: 130251,
     name: 'JewelCraft',
     icon: 'inv_jewelcrafting_70_jeweltoy',
     stackable: 1,
     isAuctionable: true,
     __v: 0 }...

но не то, что мне нужно

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Было бы лучше и быстрее, если бы вы использовали здесь какой-то трюк агрегирования

auctions.aggregate([
  { "$match": { "owner": "owner", "place": "place" }},
  { "$lookup": {
    "from": "items",
    "let": { "item": "$item" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$id", "$$item"] }}}
    ],
   "as": "item"
  }},
  { "$limit": 15 }
])
0 голосов
/ 01 декабря 2018

Если я правильно понимаю, цель состоит в том, чтобы создать новую коллекцию aucs, подобную найденным, каждая из которых обновляется и включает имя элемента из коллекции item, в которой элемент имеет соответствующий идентификатор.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...