![](/img/trans.png)
[英]Javascript convert array of objects to an array with only specific keys with ES6
[英]ES6 Method to deduplicate keys in JavaScript objects?
我有两个对象,一个包含用于应用程序的现有数据,另一个包含要导入的数据。 实际上,这些对象将变得更大,更复杂,但其想法是对数据进行重复数据删除,并找出“新数据”对象中的哪些键需要合并到本地数据集中。
我不需要有关如何合并对象的建议,而是需要知道如何获取仅存在于新数据集中的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
},
}
使用Object.keys()
和map()
从两个对象中获取uuid的数组,然后使用filter()
和includes()
使用旧的过滤新的数据键
var obj = {"Item1":{"title":"demo1","uuid":"2ecc82ba-4e47-4a8d-90ff-c4beb4148255"},"Item2":{"title":"demo3","uuid":"10b216d4-d354-42b9-8c53-f6bb9e8f0079"}} var old = {"Item1":{"title":"demo1","uuid":"2ecc82ba-4e47-4a8d-90ff-c4beb4148255"},"Item2":{"title":"demo2","uuid":"fbe9bfbf-1c61-45bb-94d0-2983328a5e74"}} var newKeys = Object.keys(obj).map(e => obj[e].uuid) var oldKeys = Object.keys(old).map(e => old[e].uuid) var result = newKeys.filter(e => !oldKeys.includes(e)); console.log(result)
难以锻炼所需的属性时,属性名称item1
, item2
最好作为数组索引,因为它可以降低复杂性。 下面增加了新的项目,如item3
时找到了新的UUID。
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)
如果您不希望搜索其他可枚举的属性,请记住使用use 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);
添加一个使用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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.