我有一组值,例如:
let values = [1, 2, 3, 4, 5];
我有另一个包含对象的数组,例如:
let objects = [{name: 'Dennis', value: 2}, {name: 'Charlie', value: 4}];
我想生成一个只包含我的对象的value属性中不存在的值的数组。
所以从上面的例子中,我将返回一个[1, 3, 5]
目前我得到的是:
let missingValues = [];
for (let i = 0; i < values.length; i++) {
if (!objects.filter(obj => obj.value === values[i]) {
missingValues.push(values[i]);
}
}
这有效,但感觉有点凌乱,有更有效的方法吗?
答案 0 :(得分:3)
您可以在对象数组中查找值来过滤值。
var values = [1, 2, 3, 4, 5],
objects = [{ name: 'Dennis', value: 2 }, { name: 'Charlie', value: 4 }],
result = values.filter(v => !objects.find(({ value }) => value === v));
console.log(result);
&#13;
答案 1 :(得分:2)
......有更有效的方法吗?
我认为你真的是指&#34;高效&#34; (而不是&#34;简洁&#34;)。
是的,您可以构建一个对象或Set
包含第二个数组中的值,然后使用它来过滤:
let values = [1, 2, 3, 4, 5];
let objects = [{name: 'Dennis', value: 2}, {name: 'Charlie', value: 4}];
let valueSet = new Set();
for (const obj of objects) {
valueSet.add(obj.value);
}
let missingValues = values.filter(value => !valueSet.has(value));
console.log(missingValues);
&#13;
(如果您愿意,也可以使用同一个对象。let valueSet = Object.create(null);
然后valueSet[value] = true
和!valueSet[value]
。)
如果数组的产品非常大(数十万个条目),或者您正在做批次,这是值得做的。