我想找出两个对象的不同之处,只获取更新的键并返回它们。
我使用过deep-diff,object-diff npm库。但这是行不通的。
我怎么才能解决这个问题?
我只想要被改变的钥匙。无论它们是更新、添加还是删除。
下面是我尝试过的代码。
const diff = require("deep-object-diff").diff;
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]
}
console.log(diff(oldData, newData));所以我想要被改变的键,比如name,marks,hobbies。
任何帮助都会很好。
谢谢。
发布于 2019-12-31 07:13:07
let setA = new Set(Object.values(oldData))
let setB= new Set(Object.values(newData)) 这些将使用旧的和新的值生成数组,然后使它们成为Set。利用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..etc),值是differenceArray的项。您得到了更改的值,现在我们需要在开始时的对象(oldData)中找到属于这些值的键。
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"]keysArray是由更改的键组成的数组。
发布于 2019-12-31 07:08:04
如果假设对象没有嵌套对象,我将从单独的数组中提取密钥,如下所示
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。此外,如果对象包含其他对象,则需要考虑递归策略。
发布于 2019-12-31 06:32:15
您可以使用for in语法。
for (let prop in first_obj){
if(prop !== second_obj){
return [Object.keys(first_obj),Object.keys(second_obj)]
}
}此函数的返回将是或未定义--它们相等,或包含两个数组的数组--每个数组都是一个对象的键数组。
https://stackoverflow.com/questions/59540341
复制相似问题