我有两个对象,一个包含我的应用程序的现有数据,另一个包含要导入的数据。实际上,对象将更大,更复杂,但我们的想法是对数据进行重复数据删除,并从“新数据”中找出哪些键。对象需要合并到本地数据集中。
我不需要有关如何合并对象的建议,而是我需要知道如何获取仅存在于新数据集中的UUID列表,以便我可以手动导入数据。后面的步骤基于那些UUID。
我知道我可以用疯狂的for循环做到这一点,但是这样做的ES6方式是什么?
非常感谢
现有数据:
{
Item1: {
title: 'demo1',
uuid: 2ecc82ba-4e47-4a8d-90ff-c4beb4148255
},
Item2: {
title: 'demo2',
uuid: fbe9bfbf-1c61-45bb-94d0-2983328a5e74
},
}
要导入的新数据:
{
Item1: {
title: 'demo1',
uuid: 2ecc82ba-4e47-4a8d-90ff-c4beb4148255
},
Item2: {
title: 'demo3',
uuid: 10b216d4-d354-42b9-8c53-f6bb9e8f0079
},
}
答案 0 :(得分:1)
使用if
和Object.keys()
从这两个对象获取uuid数组,然后使用map()
和filter()
includes()
答案 1 :(得分:1)
难以锻炼你想要的东西,属性名称item1
,item2
最适合作为数组索引,因为它会降低复杂性。以下内容添加了新项目,例如找到新uuids时的item3
。
const a = {
Item1: { title: 'demo1', uuid: "2ecc82ba-4e47-4a8d-90ff-c4beb4148255"},
Item2: { title: 'demo2', uuid: "fbe9bfbf-1c61-45bb-94d0-2983328a5e74"}
}
const b = {
Item1: { title: 'demo1', uuid: "2ecc82ba-4e47-4a8d-90ff-c4beb4148255"},
Item2: { title: 'demo3', uuid: "10b216d4-d354-42b9-8c53-f6bb9e8f0079"}
}
const findIn = (obj,cb) => { for(let i in obj){ if (cb(obj[i],i) === true) return obj[i] } };
for(var i in b){
if(!findIn(a,obj => obj.uuid === b[i].uuid)){
const pName = Object.keys(a).pop();
const newPropName = pName.substr(0,4) + (Number(pName.substr(4)) + 1);
a[newPropName] = Object.assign({},b[i]);
}
}
console.log(a)

如果您不想搜索其他可枚举属性,请务必使用getOwnPropertyNames()
或执行hasOwnProperty()
。
更安全的版本但使用更多资源。
const a = {
Item1: { title: 'demo1', uuid: "2ecc82ba-4e47-4a8d-90ff-c4beb4148255"},
Item2: { title: 'demo2', uuid: "fbe9bfbf-1c61-45bb-94d0-2983328a5e74"}
}
const b = {
Item1: { title: 'demo1', uuid: "2ecc82ba-4e47-4a8d-90ff-c4beb4148255"},
Item2: { title: 'demo3', uuid: "10b216d4-d354-42b9-8c53-f6bb9e8f0079"}
}
function appendNewItems(obj1,obj2){
const objKeys1 = Object.keys(obj1);
const objKeys2 = Object.keys(obj2);
const findIn = (obj,cb) => { for(let i of objKeys1){ if (cb(obj[i], i) === true) return obj[i] } };
for(var i of objKeys2){
if(!findIn(a,obj => obj.uuid === b[i].uuid)){
const pName = Object.keys(a).pop();
const newPropName = pName.substr(0, 4) + (Number(pName.substr(4)) + 1);
a[newPropName] = Object.assign({}, b[i]);
// must add the new property name or you could get duplicates
objKeys1.push(newPropName);
}
}
}
appendNewItems(a,b);
console.log(a);

答案 2 :(得分:0)
添加使用Set的工作示例:
const existingData = {
Item1: {
title: 'demo1',
uuid: '2ecc82ba-4e47-4a8d-90ff-c4beb4148255'
},
Item2: {
title: 'demo2',
uuid: 'fbe9bfbf-1c61-45bb-94d0-2983328a5e74'
}
};
const newData = {
Item1: {
title: 'demo1',
uuid: '2ecc82ba-4e47-4a8d-90ff-c4beb4148255'
},
Item2: {
title: 'demo3',
uuid: '10b216d4-d354-42b9-8c53-f6bb9e8f0079'
}
};
const existingUUIDs = new Set(Object.entries(existingData).map(([k, {uuid}]) => uuid));
const newUUIDs = Object.entries(newData).map(([k, {uuid}]) => uuid).filter((uuid) => existingUUIDs.has(uuid));
console.log(newUUIDs);