我想删除原始数组中的特定元素(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);
答案 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_003
和a
,但将其保留在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