我有2个对象数组。一个数组从API接收数据并将其呈现在应用程序中,另一个数组从localStorage接收数据,这些数据是第一个数组的数据,已经更改并存储在localStorage中。我想连接这两个数组,但是我需要删除重复的数据,以免两次渲染同一对象。
我希望的例子:
dado1 = [
{customer: {
purchased: false,
id: 1
}},
{customer: {
purchased: false,
id: 2
}}
]
dado2 = [
{customer: {
purchased: true,
id: 1
}}
]
dado3 = dado1.concat (dado2)
result:
dado3 = [
{customer: {
purchased: true,
id: 1
}},
{customer: {
purchased: false,
id: 2
}}
]
我无法比较两个数组。我想过几种方法,但我总是失败
答案 0 :(得分:0)
类似的东西吗?
const dado1 =
[ { customer: { purchased: false, id: 1 } }
, { customer: { purchased: false, id: 2 } }
]
const dado2 =
[ { customer: { purchased: true, id: 1 } }
]
const dado3 = dado1.map(el=>
{
let nv = dado2.find(x=>x.customer.id === el.customer.id )
return nv? nv : el
})
console.log( dado3 )
.as-console-wrapper { max-height: 100% !important; top: 0; }
但是要充实,这是对象的对象数组,所以更喜欢使用
const dado3 = dado1.map(el=>
{
let nv = dado2.find(x=>x.customer.id === el.customer.id )
return nv? JSON.parse(JSON.stringify(nv)) : JSON.parse(JSON.stringify(el))
})
如果您想要一个真正的新数组
答案 1 :(得分:0)
您可以通过在id
字段中进行映射来确保客户对象的唯一性,并确保来自第二个对象的条目具有优先权(相对于api结果,这将首选本地存储):
let mergeCustomerData = (arr1, arr2) => {
// Both arrays are converted to maps, where the `item.customer.id` property determines the key
[ arr1, arr2 ] = [ arr1, arr2 ].map(arr => new Map(arr.map(v => [ v.customer.id, v ])));
// Merge these Maps into one (preference determined by the order of `arr1` and `arr2`)
let merged = new Map([ ...arr1, ...arr2 ]);
// Return the merged values, converted back to an Array
return [ ...merged ].map(([ id, v ]) => v);
};
let dado1 = [
{ customer: { purchased: false, id: 1 } },
{ customer: { purchased: false, id: 2 } }
];
let dado2 = [
{ customer: { purchased: true, id: 1 } }
];
console.log(mergeCustomerData(dado1, dado2));
答案 2 :(得分:0)
从第二个数组中收集ID。作为结果,第二个数组加上第一个数组中所有ID不在存储的ID中的元素。
dado1 = [
{customer: { purchased: false, id: 1 }},
{customer: { purchased: false, id: 2 }}
];
dado2 = [
{customer: { purchased: true, id: 1 }},
{customer: { purchased: true, id: 5 }}
];
function concatDado( dado1, dado2) {
let result = dado2;
let ids = [];
dado2.forEach(element => ids.push(element.customer.id));
dado1.forEach(element => {
id = element.customer.id;
if ( ids.indexOf(id) == -1 )
result.push(element);
});
return result;
}
console.log( concatDado( dado1, dado2));