Javascript:查找两个对象之间的差异并仅返回键

Javascript:查找两个对象之间的差异并仅返回键,javascript,object,difference,Javascript,Object,Difference,我想找出两个对象的区别,只获取更新后的键并返回它们 我使用了deepdiff,objectdiffnpm库。但它不起作用 我怎样才能解决这个问题 我只想要正在更换的钥匙。无论是更新、添加还是删除 下面是我尝试过的代码 const diff=require(“deep object diff”).diff; 设oldData={ 姓名:“ABC”, 年龄:20,, 分数:[20,50,40,30], 爱好:[“玩”、“读”] } 设newData={ 名称:“XYZ”, 年龄:20,, 分数:[2

我想找出两个对象的区别,只获取更新后的键并返回它们

我使用了
deepdiff
objectdiff
npm库。但它不起作用

我怎样才能解决这个问题

我只想要正在更换的钥匙。无论是更新、添加还是删除

下面是我尝试过的代码

const diff=require(“deep object diff”).diff;
设oldData={
姓名:“ABC”,
年龄:20,,
分数:[20,50,40,30],
爱好:[“玩”、“读”]
}
设newData={
名称:“XYZ”,
年龄:20,,
分数:[20,40,80,30]
}
log(diff(oldData,newData));
因此,我需要像
名称
标记
爱好
这样正在更改的密钥

任何帮助都会很好


多谢各位

您可以使用
for in
语法

for (let prop in first_obj){
    if(prop !== second_obj){
    return [Object.keys(first_obj),Object.keys(second_obj)]
  }
}

此函数的返回值将是或未定义-它们相等,或有两个数组的数组-每个数组-一个对象的键数组

如果我们假设对象没有嵌套对象,我将从单独数组中的对象中提取键,如下所示

const allKeys = [...Object.keys(oldData),...Object.keys(newData)];
// TODO remove duplicate keys
然后比较两个对象中每个键的值,并在数组中添加具有差异的键

const changedKeys = [];
allKeys.forEach(key => {
 if(oldObj.hasOwnProperty(key) && newObj.hasOwnProperty(key)) {
  if(Array.isArray(oldObj[key])){
    // TODO loop the arrays and compare the difference
    // Wee need to do that because ['2'] === ['2'] means false.
  } else if(oldObj[key] !== newObj[key]) {
    changedKeys.push(key);
  }
 } else { // means the key was deleted 
  changedKeys.push(key);
 }
});
那么您的结果就是changedKeys数组

注意:我在没有测试的情况下写了这篇文章,可能存在bug。此外,如果对象包含其他对象,我们需要考虑一种递归策略

let setA = new Set(Object.values(oldData))
let setB=  new Set(Object.values(newData)) 
这些将使用您的旧值和新值创建数组,并在之后将它们设置为
Set
。借助集合方法,我们可以定位差异

function difference(setA, setB) {
    let _difference = new Set(setA)
    for (let elem of setB) {
        _difference.delete(elem)
    }
    return _difference
}
let differenceArray = Array.from(_difference); // making Array from a Set
let differenceObject = Object.assign({},differenceArray)  
现在我们制作了一个对象,它的键只是索引(0,1,2..等等),值是differenceArray的项。您得到了更改的值,现在我们需要在开始时在对象中找到属于这些值的键(oldData)


keysArray
是由更改的键组成的数组

您想要对象中键的差异,还是所有差异,还是更新删除时的更改等?我只想要删除、更新或添加的键。因为从前端,我将只发送更新或添加或删除的密钥的更新数组。谢谢您的回答。它不起作用了。@XperiaReno我编辑了答案。你现在可以试试吗?不再工作了。我得到所有带钥匙的数组。我的目标可能会有所不同。所以我需要处理任何发生的案件。我在问题中所举的例子只是一个虚构的例子。不是真正的解决方案。我认为这个解决方案是一个很好的起点,但你也需要处理嵌套对象。@John你说得有道理,我会再看一遍谢谢你的回答。对象可能会有所不同。对象内部可能有数组。嵌套的对象也将出现在那里。
 let oldData = {
  name: 'ABC',
  age: 20,
  marks: [20, 50, 40, 30],
  hobbies: ['playing', 'reading']
}

let newData = {
  name: 'XYZ',
  age: 20,
  marks: [20, 40, 80, 30]
}


let setA = new Set(Object.values(oldData))
let setB=  new Set(Object.values(newData)) 


function difference(setA, setB) {
    let _difference = new Set(setA)
    for (let elem of setB) {
        _difference.delete(elem)
    }
    return _difference
}
let differenceArray = Array.from(difference(setA, setB)); // making Array from a Set
let differenceObject = Object.assign({},differenceArray)  


const keysArray = [];
for (let value of Object.values(differenceArray)) {
  keysArray.push(Object.keys(oldData).filter(key => oldData[key] === value));
}


console.log(keysArray)  // 0: ["name"] 1: ["marks"] 2: ["hobbies"]