首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript :找出两个对象之间的区别,只返回键

Javascript :找出两个对象之间的区别,只返回键
EN

Stack Overflow用户
提问于 2019-12-31 06:19:04
回答 3查看 1.9K关注 0票数 0

我想找出两个对象的不同之处,只获取更新的键并返回它们。

我使用过deep-diffobject-diff npm库。但这是行不通的。

我怎么才能解决这个问题?

我只想要被改变的钥匙。无论它们是更新、添加还是删除。

下面是我尝试过的代码。

代码语言:javascript
复制
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));

所以我想要被改变的键,比如namemarkshobbies

任何帮助都会很好。

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2019-12-31 07:13:07

代码语言:javascript
复制
let setA = new Set(Object.values(oldData))
let setB=  new Set(Object.values(newData)) 

这些将使用旧的和新的值生成数组,然后使它们成为Set。利用Set方法,我们可以找到这些差异。

代码语言:javascript
复制
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)中找到属于这些值的键。

代码语言:javascript
复制
 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是由更改的键组成的数组。

票数 1
EN

Stack Overflow用户

发布于 2019-12-31 07:08:04

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

代码语言:javascript
复制
const allKeys = [...Object.keys(oldData),...Object.keys(newData)];
// TODO remove duplicate keys

然后,我将比较每个键在两个对象中的值,并在数组中添加带有差异的键。

代码语言:javascript
复制
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。此外,如果对象包含其他对象,则需要考虑递归策略。

票数 0
EN

Stack Overflow用户

发布于 2019-12-31 06:32:15

您可以使用for in语法。

代码语言:javascript
复制
for (let prop in first_obj){
    if(prop !== second_obj){
    return [Object.keys(first_obj),Object.keys(second_obj)]
  }
}

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59540341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档