两个JS对象,如何从第一个对象获得它在第二个对象中丢失的值?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (397)

我有两个JS对象:

var first = [{name: "Sam", group: "test"}, {name: "John", group: "it"}];
var second = [{name: "John", group: "it"}, {name: "Tim", group: "hr"}];
    
for (var k = 0; k < first.length; k++) {
    if (first.indexOf(second[k]) == -1) {
        console.log('found');
    }
}

我试图过滤掉一个存在于first,但却缺少second的值。我怎样才能做到这一点?

理想的返回值: {name: "Sam", group: "test"}

提问于
用户回答回答于

使用Array.filter,我们可以返回传递条件的项目。在这种情况下,条件是“不在第二个列表中”,我们可以用Array.some表达。

function getItemsOnlyInFirst(first, second) {
  return first.filter(
    item =>
      !second.some(
        compareItem =>
          item.name === compareItem.name && item.group === compareItem.group
      )
  );
}

let first = [{ name: "Sam", group: "test" }, { name: "John", group: "it" }];
let second = [{ name: "John", group: "it" }, { name: "Tim", group: "hr" }];

getItemsOnlyInFirst(first, second); // {name: "Sam", group: "test"}
用户回答回答于

问题是你无法将两个对象与==运算符进行比较:

var obj1 = {test: 1}
var obj2 = {test: 1}

console.log(obj1 == obj2) // false

一个简单的解决方案是将对象转换为JSON格式。

这有效,因为你可以比较字符串:

var obj1 = JSON.stringify({test: 1})
var obj2 = JSON.stringify({test: 1})

console.log(obj1 == obj2) // true

使用JSON.stringify的解决方案:

var first  = [{name: "Sam", group: "test"}, {name: "John", group: "it"}];
var second = [{name: "John", group: "it"} , {name: "Tim", group: "hr"}];

// Convert the objects to JSON
var second_str = second.map(JSON.stringify)

var filtered = first.filter(function(elem) {
    return second_str.indexOf(JSON.stringify(elem)) == -1
})

console.log(filtered)

扫码关注云+社区

领取腾讯云代金券