繁体   English   中英

ES6在JavaScript对象中重复删除键的方法?

[英]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) 

难以锻炼所需的属性时,属性名称item1item2最好作为数组索引,因为它可以降低复杂性。 下面增加了新的项目,如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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM