两个JS对象,从第一个对象中获取一个值,第二个中缺少

时间:2018-06-29 21:10:23

标签: javascript

我有两个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"}

尝试了很多事情,目前没有任何效果。例如:

3 个答案:

答案 0 :(得分:0)

使用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"}

答案 1 :(得分:0)

问题是您无法使用==运算符比较两个对象:

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)

答案 2 :(得分:0)

我了解他们都共享相同的界面?对于复杂的对象,可以将lodash与例如_.differenceBy函数一起使用,但是这里的情况很简单(仍然,方法很通用,不依赖于对象内部的键,但是它们必须为平面结构[无递归])

let isOnlyInFirst = first.filter(el => {
    return !second.some(z => {
        const el_keys = Object.keys(el)
        const z__keys = Object.keys(z)
        let flag = true
        for (const key of el_keys) {
            if (!z.hasOwnProperty(key) || z[key] != el[key]) flag = false
        }
        if (el_keys.length === z__keys.length && flag)
            return true
        return false
    })
})