【问题标题】:Compare keys from 2 objects and replace比较来自 2 个对象的键并替换
【发布时间】:2017-10-12 15:20:58
【问题描述】:

我有 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'
    }

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

【问题讨论】:

    标签: javascript object properties underscore.js


    【解决方案1】:

    那么只需循环 obj2 中的键,如果迭代的 key 存在于其上,则使用 obj2 中的值更新 obj1 并删除此 key 的旧 value

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

    【讨论】:

    • 有趣的是,尽管结果错误,但这个答案得到了赞成。
    • @NinaScholz 我的错,我看错了问题,更新了答案。
    【解决方案2】:

    有趣的问题,你可以循环obj1的keys,如果obj2包含那个key,把obj1的key替换成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/

    【讨论】:

    • 真的很感激这个答案,尤其是.reduce的使用。我不得不编辑我上面的问题,我想知道你能扩展你的答案吗??
    【解决方案3】:

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

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

    【讨论】:

    • 嘿尼娜,谢谢你的回答!我稍微更新了我的问题,不知道你能快速看一下吗?
    • 非常感谢尼娜!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多