比较来自 2 个对象的键并替换

Compare keys from 2 objects and replace

我有 2 个对象,一个包含我想要的数据,但我也得到了一些不需要的 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'
    }

我想比较这 2 个对象的键,在它们匹配的任何地方,将 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',
    }

有趣的问题,您可以循环 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/

好吧,简单地遍历 obj2 中的键并更新 obj1 如果迭代的 key 存在于 obj2 中的值并删除旧的 [=这个 key 的 16=]:

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

演示:

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);

您可以迭代键并替换属性。

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);