Javascript 查找数组对象的值差异

Javascript 查找数组对象的值差异,javascript,lodash,Javascript,Lodash,我有两个数组,它们都由随机键和值组成。我有一个更新的对象和当前对象。但是更新的对象包含新值和旧值。我想找出这两个对象的键和值之间的差异,用新的键或值生成新的更新对象 当前对象 { key1: "abc" key2: "ggg" key3: 0, key4: ["1","3","5"] key5: [1,2,3,4,5] key6: [9,8,7,6], key7: false } { key1: "abc" key2: "new" key3: 30,

我有两个数组,它们都由随机键和值组成。我有一个更新的对象和当前对象。但是更新的对象包含新值和旧值。我想找出这两个对象的键和值之间的差异,用新的键或值生成新的更新对象

当前对象

{
  key1: "abc"
  key2: "ggg"
  key3: 0,
  key4: ["1","3","5"]
  key5: [1,2,3,4,5]
  key6: [9,8,7,6],
  key7: false
}
{
  key1: "abc"
  key2: "new"
  key3: 30,
  key4: ["1","3","5"]
  key5: [2,3,4]
  key6: [],
  key7: true,
  special8: [1,2,3]
}
{
  key2: "new"
  key3: 30,
  key5: [2,3,4]
  key6: [],
  key7: true,
  special8: [1,2,3]
}
更新对象

{
  key1: "abc"
  key2: "ggg"
  key3: 0,
  key4: ["1","3","5"]
  key5: [1,2,3,4,5]
  key6: [9,8,7,6],
  key7: false
}
{
  key1: "abc"
  key2: "new"
  key3: 30,
  key4: ["1","3","5"]
  key5: [2,3,4]
  key6: [],
  key7: true,
  special8: [1,2,3]
}
{
  key2: "new"
  key3: 30,
  key5: [2,3,4]
  key6: [],
  key7: true,
  special8: [1,2,3]
}
结果

{
  key1: "abc"
  key2: "ggg"
  key3: 0,
  key4: ["1","3","5"]
  key5: [1,2,3,4,5]
  key6: [9,8,7,6],
  key7: false
}
{
  key1: "abc"
  key2: "new"
  key3: 30,
  key4: ["1","3","5"]
  key5: [2,3,4]
  key6: [],
  key7: true,
  special8: [1,2,3]
}
{
  key2: "new"
  key3: 30,
  key5: [2,3,4]
  key6: [],
  key7: true,
  special8: [1,2,3]
}

根据您的条件:以下
reduce()
函数将更新的
对象的每个属性与当前的
对象的每个属性进行比较,并返回一个包含差异的全新对象

请注意:只需使用
简单地比较字符串数组(例如
key4
属性)==
可以返回假阴性,因此使用
JSON.stringify()

//当前对象。
恒定电流={
关键词1:“abc”,
键2:“ggg”,
键3:0,
键4:[“1”、“3”、“5”],
键5:[1,2,3,4,5],
键6:[9,8,7,6],
关键7:错误
}
//更新对象。
常数更新={
关键词1:“abc”,
键2:“新”,
键3:30,
键4:[“1”、“3”、“5”],
键5:[2,3,4],
键6:[],
关键7:没错,
专题8:[1,2,3]
}
//差异对象。
常量差异=(Object.keys(更新)).reduce((差异,键)=>{
//同样的?
if(JSON.stringify(updated[key])==JSON.stringify(current[key])返回差异
//不一样。
返回{…差异[key]:更新的[key]}
}, {})

console.log(差异)
给定您的条件:以下
reduce()
函数将更新的
对象的每个属性与当前的
对象的每个属性进行比较,并返回一个包含差异的全新对象

请注意:只需使用
简单地比较字符串数组(例如
key4
属性)==
可以返回假阴性,因此使用
JSON.stringify()

//当前对象。
恒定电流={
关键词1:“abc”,
键2:“ggg”,
键3:0,
键4:[“1”、“3”、“5”],
键5:[1,2,3,4,5],
键6:[9,8,7,6],
关键7:错误
}
//更新对象。
常数更新={
关键词1:“abc”,
键2:“新”,
键3:30,
键4:[“1”、“3”、“5”],
键5:[2,3,4],
键6:[],
关键7:没错,
专题8:[1,2,3]
}
//差异对象。
常量差异=(Object.keys(更新)).reduce((差异,键)=>{
//同样的?
if(JSON.stringify(updated[key])==JSON.stringify(current[key])返回差异
//不一样。
返回{…差异[key]:更新的[key]}
}, {})

console.log(差异)
以下内容将解决您的需要:

"use strict";

let _ = require ('lodash');    

let x = {
  key1: "abc",
  key2: "ggg",
  key3: 0,
  key4: ["1","3","5"],
  key5: [1,2,3,4,5],
  key6: [9,8,7,6],
  key7: false
};

let y = {
  key1: "abc",
  key2: "new",
  key3: 30,
  key4: ["1","3","5"],
  key5: [2,3,4],
  key6: [],
  key7: true,
  special8: [1,2,3]
};

let result = {};

_.each(y,function(value,key){

    //when the key is not present in x at all
    if(!x[key]){
        result[key] = y[key];
    }
    //when the value is of type array
    else if(Array.isArray(y[key])){
        if(y[key].toString() !== x[key].toString()){
            result[key] = y[key];
        }
    }
    //for all other type of values
    else if(y[key] !== x[key]) {
        result[key] = y[key];
    }
});

console.log(result);

以下将解决您的需求:

"use strict";

let _ = require ('lodash');    

let x = {
  key1: "abc",
  key2: "ggg",
  key3: 0,
  key4: ["1","3","5"],
  key5: [1,2,3,4,5],
  key6: [9,8,7,6],
  key7: false
};

let y = {
  key1: "abc",
  key2: "new",
  key3: 30,
  key4: ["1","3","5"],
  key5: [2,3,4],
  key6: [],
  key7: true,
  special8: [1,2,3]
};

let result = {};

_.each(y,function(value,key){

    //when the key is not present in x at all
    if(!x[key]){
        result[key] = y[key];
    }
    //when the value is of type array
    else if(Array.isArray(y[key])){
        if(y[key].toString() !== x[key].toString()){
            result[key] = y[key];
        }
    }
    //for all other type of values
    else if(y[key] !== x[key]) {
        result[key] = y[key];
    }
});

console.log(result);

下面是另一个解决方案:

我们将使用两个不同的函数。equals函数用于查看相等的特定对象是否相等:

function equals(obj1, obj2) {
    let equals = true;
    if (!obj1) return;
    if (obj1.length == obj2.length) {
        for (var index in obj1) {
            if (obj1[index] != obj2[index]) {
                return false;
            }
        }
    } else return false;
    return true;
}
然后,实际的printDifferences函数使用上述函数检查两个对象的差异。然后以另一个对象的形式返回

function printDifferences(object1, object2) {
    let newObj = {};
    for (var key in object2) {
        if ((typeof object1[key] == "object" && !equals(object1[key], object2[key])) ||
            (typeof object1[key] != "object" && object1[key] != object2[key]) ||
            object1[key] == undefined) {
            newObj[key] = object2[key];
        }
    }
    return newObj;
}

console.log(printDifferences(current, updated))

下面是另一个解决方案:

我们将使用两个不同的函数。equals函数用于查看相等的特定对象是否相等:

function equals(obj1, obj2) {
    let equals = true;
    if (!obj1) return;
    if (obj1.length == obj2.length) {
        for (var index in obj1) {
            if (obj1[index] != obj2[index]) {
                return false;
            }
        }
    } else return false;
    return true;
}
然后,实际的printDifferences函数使用上述函数检查两个对象的差异。然后以另一个对象的形式返回

function printDifferences(object1, object2) {
    let newObj = {};
    for (var key in object2) {
        if ((typeof object1[key] == "object" && !equals(object1[key], object2[key])) ||
            (typeof object1[key] != "object" && object1[key] != object2[key]) ||
            object1[key] == undefined) {
            newObj[key] = object2[key];
        }
    }
    return newObj;
}

console.log(printDifferences(current, updated))

你试过什么?Stackoverflow不是免费的代码编写服务。目标是让您展示您的尝试和帮助您修复代码的人员当前和更新的对象是否应该具有相同的密钥?@Ayan否,更新的数据可能会有额外的新密钥,您迄今为止所做的就是为了实现这一点!你试过什么?Stackoverflow不是免费的代码编写服务。目标是让您展示您的尝试和帮助您修复代码的人员当前和更新的对象是否应该具有相同的密钥?@Ayan否,更新的数据可能会有额外的新密钥,您迄今为止所做的就是为了实现这一点!似乎不起作用。我的坏消息是,我应该迭代
更新的
对象以覆盖新键。现在试试。非常优雅的解决方案!似乎不起作用。我的坏消息是,我应该迭代
更新的
对象以覆盖新键。现在试试。非常优雅的解决方案!