/ / Používanie MongoDB ObjectIds s lodash - javascript, mongodb, lodash

Použitie MongoDB ObjectIds s lodash - javascript, mongodb, lodash

Pri práci s ObjectIds a lodash stále narážam na problémy. Povedzme, že mám dve polia objektov, ktoré chcem použiť lodash _.unionBy() s:

var arr1 = [
{
_id: ObjectId("abc123"),
old: "Some property from arr1",
},
{
_id: ObjectId("def456"),
old: "Some property from arr1",
},
];

var arr 2 = [
{
_id: ObjectId("abc123"),
new: "I want to merge this with object in arr1",
},
{
_id: ObjectId("def456"),
new: "I want to merge this with object in arr1",
},
];

var res = _.unionBy(arr1, arr2, "_id");

výsledok

console.log(res);
/*
[
{
_id: ObjectId("abc123"),
old: "Some property from arr1",
},
{
_id: ObjectId("def456"),
old: "Some property from arr1",
},
{
_id: ObjectId("abc123"),
new: "I want to merge this with object in arr1",
},
{
_id: ObjectId("def456"),
new: "I want to merge this with object in arr1",
},
]
*/

Požadovaný výsledok

[
{
_id: ObjectId("abc123"),
old: "Some property from arr1",
new: "I want to merge this with object in arr1",
},
{
_id: ObjectId("def456"),
old: "Some property from arr1",
new: "I want to merge this with object in arr1",
},
]

Pretože ObjectIds sú objekty a nie súpoukazujúc na rovnakú referenciu v mnohých prípadoch (napr. pri načítaní dokumentov z MongoDB a porovnaní s miestnym seedom na testovanie), nemôžem použiť „_id“ ako iteratee.

Ako môžem použiť lodash s ObjectID na dosiahnutie požadovaných výsledkov?

odpovede:

0 pre odpoveď č. 1

Skúste to, odstránil som ObjectId, pretože v javascript nefunguje. Na konverziu reťazcov môžete použiť .toString.

var arr1 = [{
_id: "abc123",
old: "Some property from arr1",
},
{
_id: "def456",
old: "Some property from arr1",
},
];

var arr2 = [{
_id: "abc123",
new: "I want to merge this with object in arr1",
},
{
_id: "def456",
new: "I want to merge this with object in arr1",
},
];


const data = arr2.reduce((obj, ele) => {
if (!obj[ele._id]) obj[ele._id] = ele.new;
return obj;
}, {})

arr1 = arr1.map((d) => {
if (data[d._id]) {
d.new = data[d._id];
}
return d;
})

console.log(arr1);


0 pre odpoveď č. 2

Musíte to použiť _.unionS , ktorý vám umožní použiť vlastný komparátor. Použite vlastný komparátor na kontrolu rovnosti medzi dvoma ObjectIds:

_.unionWith(arr1, arr2, (arrVal, othVal) => arrVal._id.equals(othVal._id));

Dúfam, že to pomôže.


0 pre odpoveď č. 3

Toto skončilo riešením môjho problému.

var res = arr1.map(a => {
return _.assign(a, _.find(arr2, { _id: a._id }));
});

Vďaka Tušarova odpoveď