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



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

我知道它们共享相同的界面?对于复杂的对象,您可以将 lodash 与 eg: 一起使用:_.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
})
})

相关内容

最新更新