【问题标题】:extract key values that differ between two objects (even nested objects) what approach?提取两个对象(甚至嵌套对象)之间不同的键值是什么方法?
【发布时间】:2019-10-28 12:02:19
【问题描述】:

我想比较两个几乎总是具有相同属性的对象,并根据具有与第一个对象不同的值的属性创建一个新对象。在下面的示例中,我想检查 inputData 是否有任何与 currentData 不同的键:值。然后根据这些键和值创建一个新对象。希望它有意义吗?我应该有什么方法?一些递归的Oject.assign?传播操作?循环?

const currentData = {
  title: 'John',
  email: 'info@abc.com'
  address {
    street: 'myStreet 13'  
  }
}

const inputData = {
  title: 'Tom',
  email: 'info@abc.com',
  address {
    street: 'yourStreet 17'  
  }
}

结果应该是这样的:

const result = {
  title: 'Tom',
  address: {
    street: 'yourStreet 17'
  }   
}

【问题讨论】:

    标签: javascript nested key javascript-objects


    【解决方案1】:

    您需要一个循环遍历对象的递归函数,大致如下:

    function compareObjects(a, b) {
        // Assume they'll be the same
        let result = null;
        // Keep track of the keys we've seen
        let keys = new Set();
        for (const key in a) {
            keys.add(key);
            if (!(key in b)) {
                // You'll want to decide what to do here, use `undefined`?
            } else {
                const avalue = a[key];
                const bvalue = b[key];
                if (avalue !== bvalue) {
                    const aIsObject = typeof avalue === "object";
                    const bIsObject = typeof bvalue === "object";
                    if (aIsObject && bIsObject) {
                        // Both are objects, recurse
                        const update = compareObjects(avalue, bvalue);
                        if (update) {
                            result = result || {};
                            result[key] = update;
                        }
                    } else {
                        // Different values
                        result = result || {};
                        result[key] = bvalue;
                    }
                }
            }
        }
        // Add in any that are in `b` but weren't in `a`
        for (const key in b) {
            if (!keys.has(key)) {
                result = result || {};
                result[key] = b[key];
            }
        }
        return result;
    }
    

    现场示例:

    const currentData = {
        title: 'John',
        email: 'info@abc.com',
        address: {
            street: 'myStreet 13'  
        }
    };
    
    const inputData = {
        title: 'Tom',
        email: 'info@abc.com',
        address: {
            street: 'yourStreet 17'  
        }
    };
    
    function compareObjects(a, b) {
        // Assume they'll be the same
        let result = null;
        // Keep track of the keys we've seen
        let keys = new Set();
        for (const key in a) {
            keys.add(key);
            if (!(key in b)) {
                // You'll want to decide what to do here, use `undefined`?
            } else {
                const avalue = a[key];
                const bvalue = b[key];
                if (avalue !== bvalue) {
                    const aIsObject = typeof avalue === "object";
                    const bIsObject = typeof bvalue === "object";
                    if (aIsObject && bIsObject) {
                        // Both are objects, recurse
                        const update = compareObjects(avalue, bvalue);
                        if (update) {
                            result = result || {};
                            result[key] = update;
                        }
                    } else {
                        // Different values
                        result = result || {};
                        result[key] = bvalue;
                    }
                }
            }
        }
        // Add in any that are in `b` but weren't in `a`
        for (const key in b) {
            if (!keys.has(key)) {
                result = result || {};
                result[key] = b[key];
            }
        }
        return result;
    }
    
    console.log(compareObjects(currentData, inputData));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 2020-08-10
      • 2022-08-15
      • 2023-03-27
      • 2020-02-24
      相关资源
      最近更新 更多