按值对象过滤数组,这些值不是对象数组中的属性值 - Javascript

时间:2018-03-09 17:07:09

标签: javascript

我有一组值,例如:

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]);
    }
}

这有效,但感觉有点凌乱,有更有效的方法吗?

2 个答案:

答案 0 :(得分:3)

您可以在对象数组中查找值来过滤值。

&#13;
&#13;
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;
&#13;
&#13;

答案 1 :(得分:2)

  

......有更有效的方法吗?

我认为你真的是指&#34;高效&#34; (而不是&#34;简洁&#34;)。

是的,您可以构建一个对象或Set包含第二个数组中的值,然后使用它来过滤:

&#13;
&#13;
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;
&#13;
&#13;

(如果您愿意,也可以使用同一个对象。let valueSet = Object.create(null);然后valueSet[value] = true!valueSet[value]。)

如果数组的产品非常大(数十万个条目),或者您正在做批次,这是值得做的。