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

时间:2017-07-13 16:54:06

标签: javascript json object ecmascript-6

我有两个对象,一个包含我的应用程序的现有数据,另一个包含要导入的数据。实际上,对象将更大,更复杂,但我们的想法是对数据进行重复数据删除,并从“新数据”中找出哪些键。对象需要合并到本地数据集中。

我不需要有关如何合并对象的建议,而是我需要知道如何获取仅存在于新数据集中的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
    },
}

3 个答案:

答案 0 :(得分:1)

使用ifObject.keys()从这两个对象获取uuid数组,然后使用map()filter()

过滤旧数据键

includes()

答案 1 :(得分:1)

难以锻炼你想要的东西,属性名称item1item2最适合作为数组索引,因为它会降低复杂性。以下内容添加了新项目,例如找到新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);