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"]