Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 提取两个对象(甚至嵌套对象)之间不同的键值有什么方法?_Javascript_Nested_Key_Javascript Objects - Fatal编程技术网

Javascript 提取两个对象(甚至嵌套对象)之间不同的键值有什么方法?

Javascript 提取两个对象(甚至嵌套对象)之间不同的键值有什么方法?,javascript,nested,key,javascript-objects,Javascript,Nested,Key,Javascript Objects,我想比较两个几乎总是具有相同属性的对象,并基于具有不同于第一个对象的值的属性创建一个新对象。在下面的示例中,我想检查inputData是否有与currentData不同的key:值。然后基于这些键和值创建一个新对象。希望它有意义?我应该采取什么方法?某个递归项目分配?扩展操作?循环 const currentData = { title: 'John', email: 'info@abc.com' address { street: 'myStreet 13' } }

我想比较两个几乎总是具有相同属性的对象,并基于具有不同于第一个对象的值的属性创建一个新对象。在下面的示例中,我想检查inputData是否有与currentData不同的key:值。然后基于这些键和值创建一个新对象。希望它有意义?我应该采取什么方法?某个递归项目分配?扩展操作?循环

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

您将需要一个递归函数循环遍历对象,如下所示:

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={
标题:“约翰”,
电邮:'info@abc.com',
地址:{
街道:“myStreet 13”
}
};
常量输入数据={
标题:“汤姆”,
电邮:'info@abc.com',
地址:{
街道:“yourStreet 17”
}
};
函数比较对象(a、b){
//假设它们是一样的
设result=null;
//跟踪我们看到的钥匙
设keys=newset();
用于(a中的常量键){
key.add(key);
如果(!(输入b)){
//您需要决定在这里执行什么操作,请使用“未定义”?
}否则{
const avalue=一个[键];
常量bvalue=b[键];
if(avalue!==bvalue){
const aIsObject=typeof avalue==“object”;
const bIsObject=typeof bvalue==“object”;
if(aIsObject&&bIsObject){
//两者都是对象,递归
常量更新=比较对象(avalue,bvalue);
如果(更新){
结果=结果|{};
结果[键]=更新;
}
}否则{
//不同的价值观
结果=结果|{};
结果[键]=b值;
}
}
}
}
//添加任何在'b'中但不在'a'中的`
用于(b中的常量键){
如果(!key.has(key)){
结果=结果|{};
结果[键]=b[键];
}
}
返回结果;
}
log(比较对象(currentData、inputData))