过滤并删除数组中的过滤元素

时间:2016-05-23 07:43:24

标签: javascript arrays node.js

我想删除原始数组中的特定元素(var a)。我filter()该数组和splice()返回了新数组。但这对此代码中的原始数组没有影响。如何从原始数组中轻松删除这些元素?

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}]

var b = a.filter(function (e) {
    return e.name === 'tc_001';
});

b.splice(0,1);

console.log(a);
console.log(b);

6 个答案:

答案 0 :(得分:17)

Array.prototype.filter()方法用于收集元素集,而不仅仅是一个项目。如果您想通过评估条件获得一个项目,那么您还有其他三个选项。 Array.prototype.indexOf()Array.prototype.findIndex()Array.prototype.find()因此,只有当您想对多个项目进行操作时,您才应该考虑使用过滤器功能。在需要完成的工作方面,没有一个答案是完整的。他们使用过滤器功能来隔离一个集合(在这个例子中恰好只是一个项目),但他们没有展示如何摆脱整个集合。好吧,让我们澄清一下。

如果你只想查找和删除数组中的一个项目,就应该这样做



var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}];
a.splice(a.findIndex(e => e.name === "tc_001"),1);
console.log(a);




然而,既然你提到了特定元素"在复数形式中,您需要收集一组选定的项目,并在集合中的每个元素上逐一执行上述工作。所以正确的方法是。



var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}],
    b = a.filter(e => e.name === "tc_001");
b.forEach(f => a.splice(a.findIndex(e => e.name === f.name),1));
console.log(a);




无论您选择的列表中有多少元素,这都可以完成您的工作。但我相信虽然这看起来合乎逻辑,但它确实有大量的冗余工作。第一个过滤器然后每个过滤后的元素会对此进行索引搜索。虽然我知道findIndex很快就疯了但我会发现这个结果显然很慢,特别是对于大数组而言。让我们找一个o(n)解决方案。你去吧



    var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}];
    a = a.reduce((p,c) => (c.name !== "tc_001" && p.push(c),p),[]);
console.log(a);




所以必须如此。

答案 1 :(得分:5)

另一种方法是在两个列表中过滤,如下所示:

const originalList = [{condition:true}, {condition: false}, {condition: true}];

// wished lists
const listWithTrue = originalList.filter(x=>x.condition);
const listWithFalse = originalList.filter(x=>!x.condition); // inverse condition

答案 2 :(得分:2)

因此,如果我理解,您希望从原始数组中删除与过滤器匹配的元素(a),但将它们保留在新数组中(b)查看此解决方案是否符合您的要求:

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}]

var b = a.filter(function (e) {
      return e.name === 'tc_002'
});

b.forEach(function(element) {
   console.log(element)
   var index = a.indexOf(element)
   console.log(index)
   a.splice(index, 1)
})

结果:a = [{" name":" tc_001"},{" name":" tc_003"}] b = [{"名称":" tc_002"}]

答案 3 :(得分:2)

我知道我参加聚会有点晚了,但是有些不同的方法呢?

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_002'}, {name:'tc_002'}, {name:'tc_003'}];

while ( a.findIndex(e => e.name === 'tc_002' ) >= 0 )
 a.splice( a.findIndex(f => f.name === 'tc_002'),1);
 
console.log(a);

我知道它有一些缺点,但是我希望它在某些情况下会对您的某些人有所帮助:)

欢呼!

答案 4 :(得分:1)

您可以将过滤器数组分配给自身,然后在其上应用拼接。

以下示例:

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}]
a = a.filter(function (e) {
    return e.name === 'tc_001';
});

a.splice(0,1);

答案 5 :(得分:0)

您可以更改原始数组:

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}]
a = a.filter(function (e) {
    return e.name === 'tc_001';
});
a.splice(0,1);

或者在您自己的代码中,只需申请a您对b

所做的一切
a = b

[编辑]

如果我扩展每个动作的作用,也许会更清楚。

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}]
// You now have array a with 3 elements.

b = a.filter(function (e) {
    return e.name === 'tc_001';
});
// a is still 3 elements, b has one element (tc_001)

b.splice(0,1);
// You remove the first element from b, so b is now empty.

如果您要从tc_002中移除元素tc_003a,但将其保留在b中,则可以执行以下操作:

var a = [{name:'tc_001'}, {name:'tc_002'}, {name:'tc_003'}]
b = a.filter(function (e) {
    return e.name != 'tc_001';
});
a = a.filter(function(item) { return b.indexOf(item) == -1; });
console.log(a); // tc_001
console.log(b); // tc_002, tc_003
相关问题