首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >两个JS对象,从第一个对象中获取在第二个对象中缺失的值

两个JS对象,从第一个对象中获取在第二个对象中缺失的值
EN

Stack Overflow用户
提问于 2018-06-30 05:10:23
回答 3查看 102关注 0票数 0

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

尝试了很多方法,但目前都不起作用。例如:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-30 05:27:42

使用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"}
票数 0
EN

Stack Overflow用户

发布于 2018-06-30 05:27:59

问题是不能用==运算符比较两个对象:

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)
票数 0
EN

Stack Overflow用户

发布于 2018-06-30 05:45:26

我知道它们都有相同的界面?对于复杂的对象,你可以使用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
    })
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51109445

复制
相关文章

相似问题

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