我有两个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"}
尝试了很多事情,目前没有任何效果。例如:
答案 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
})
})