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ď č. 1Skú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ď