比较2个对象的键并替换

时间:2017-10-12 15:20:58

标签: javascript object properties underscore.js

我有两个对象,一个包含我想要的数据,但我也得到一些不需要的API名称,我有第二个对象,它具有正确的名称,用于替换这些API名称。

但是我很难将它们换掉,我不确定如何比较对象键并将它们换掉。

obj1 = {
        Id: 'XXX123CCCVVV',
        API_NAME__c : 'Joe',
        API_ADDRESS__c : '123 FAKE STREET',
        API_DOB__c : '6/6/1966',
        Account : 'Johnson & Smith',
        Position : 'CEO' 
    }

obj2 = {
        API_NAME__c : 'Name',
        API_ADDRESS__c : 'Address',
        API_DOB__c : 'Date of birth'
    }

我想比较这两个对象的密钥,并且在它们匹配的任何地方,将obj2的值交换为obj1的密钥,因此obj1最终会如下所示:

obj1 = {
        Id: 'XXX123CCCVVV',
        Name : 'Joe',
        Address : '123 FAKE STREET',
        Date of birth : '6/6/1966',
        Account : 'Johnson & Smith',
        Position : 'CEO' 
    }

有人可以建议一种方法来实现这个目标吗?

如果可能有帮助的话,我现在使用underscore.js。

更新

我非常感谢下面的优秀答案,但我想知道是否可以扩展此逻辑以生成仅包含具有新属性名称的值的第三个对象?

所以我最终会得到以下结论:

obj1 = {
        Id: 'XXX123CCCVVV',
        Account : 'Johnson & Smith',
        Position : 'CEO' 
    }

obj3 = {
        Name : 'Joe',
        Address : '123 FAKE STREET',
        Date of birth : '6/6/1966',
    }

3 个答案:

答案 0 :(得分:2)

简单地循环遍历obj2中的密钥并更新obj1如果迭代key上存在来自obj2的值并删除旧value这个key

Object.keys(obj2).forEach(function(key){
    if(obj1[key]){
        obj1[obj2[key]] = obj1[key];
        delete obj1[key];
    }
});

<强>演示:

&#13;
&#13;
var obj1 = {
  Id: 'XXX123CCCVVV',
  API_NAME__c: 'Joe',
  API_ADDRESS__c: '123 FAKE STREET',
  API_DOB__c: '6/6/1966',
  Account: 'Johnson & Smith',
  Position: 'CEO'
}

var obj2 = {
  API_NAME__c: 'Name',
  API_ADDRESS__c: 'Address',
  API_DOB__c: 'Date of birth'
}

Object.keys(obj2).forEach(function(key){
    if(obj1[key]){
        obj1[obj2[key]] = obj1[key];
        delete obj1[key];
    }
});
console.log(obj1);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

有趣的问题,您可以循环obj1的密钥,如果obj2包含该密钥,请将obj1中的密钥替换为obj2中的该值:

for (let key in obj1) {
    if (obj2.hasOwnProperty(key)) {
        obj1[obj2[key]] = obj1[key]
        delete obj1[key]; //remove old entry
    }
}

.reduce

let newObj = Object.keys(obj1).reduce((o, k) => {
    let newKey = obj2.hasOwnProperty(k) ? obj2[k] : k;
    o[newKey] = obj1[k];

    return o;
}, {});

演示:https://jsfiddle.net/f3vuoppf/2/

答案 2 :(得分:1)

您可以迭代密钥并替换属性。

var obj1 = { Id: 'XXX123CCCVVV', API_NAME__c: 'Joe', API_ADDRESS__c: '123 FAKE STREET', API_DOB__c: '6/6/1966', Account: 'Johnson & Smith', Position: 'CEO' },
    obj2 = { API_NAME__c: 'Name', API_ADDRESS__c: 'Address', API_DOB__c: 'Date of birth' };
  
Object.keys(obj2).forEach(function (k) {
    obj1[obj2[k]] = obj1[k];
    delete obj1[k];
});

console.log(obj1);

作为替代方案,您可以生成新对象。

var obj1 = { Id: 'XXX123CCCVVV', API_NAME__c: 'Joe', API_ADDRESS__c: '123 FAKE STREET', API_DOB__c: '6/6/1966', Account: 'Johnson & Smith', Position: 'CEO' },
    obj2 = { API_NAME__c: 'Name', API_ADDRESS__c: 'Address', API_DOB__c: 'Date of birth' },
    obj3 = Object.assign(...Object.keys(obj1).map(k => ({ [obj2[k] || k]: obj1[k] })));

console.log(obj3);

第三个对象......

var obj1 = { Id: 'XXX123CCCVVV', API_NAME__c: 'Joe', API_ADDRESS__c: '123 FAKE STREET', API_DOB__c: '6/6/1966', Account: 'Johnson & Smith', Position: 'CEO' },
    obj2 = { API_NAME__c: 'Name', API_ADDRESS__c: 'Address', API_DOB__c: 'Date of birth' },
    obj3 = {};

Object.keys(obj1).forEach(function (k) {
    if (k in obj2) {
        obj3[obj2[k]] = obj1[k];
        delete obj1[k];
    }
});

console.log(obj1);
console.log(obj3);