Javascript 从数组中删除与特定字符串匹配的所有元素

Javascript 从数组中删除与特定字符串匹配的所有元素,javascript,Javascript,从数组中删除与特定字符串匹配的所有元素的最简单方法是什么?例如: array=[1,2,'deleted',4,5,'deleted',6,7] 我想从数组中删除所有'deleted'。只需使用函数获取条件的元素即可 var array = [1,2,'deleted',4,5,'deleted',6,7]; var newarr = array.filter(function(a){return a !== 'deleted'}) 更新:ES6语法 如果需要相同的数组,则可以使用 var a

从数组中删除与特定字符串匹配的所有元素的最简单方法是什么?例如:

array=[1,2,'deleted',4,5,'deleted',6,7]

我想从数组中删除所有
'deleted'

只需使用函数获取条件的元素即可

var array = [1,2,'deleted',4,5,'deleted',6,7];
var newarr = array.filter(function(a){return a !== 'deleted'})
更新:ES6语法
如果需要相同的数组,则可以使用

var array = [1,2,'deleted',4,5,'deleted',6,7];
var index = "deleted";
for(var i = array.length - 1; i >= 0; i--) {
    if(array[i] === index) {
       array.splice(i, 1);
    }
}

否则,您可以使用
Array.prototype.filter
创建一个新数组,其中包含通过所提供函数实现的测试的所有元素

 var arrayVal = [1,2,'deleted',4,5,'deleted',6,7];
function filterVal(value) {
  return value !== 'deleted';
}
var filtered = arrayVal.filter(filterVal);

如果要从主数组中删除多个字符串,可以尝试此操作

// Your main array 
var arr = [ '8','abc','b','c'];

// This array contains strings that needs to be removed from main array
var removeStr = [ 'abc' , '8'];

arr = arr.filter(function(val){
  return (removeStr.indexOf(val) == -1 ? true : false)
})

console.log(arr);

// 'arr' Outputs to :
[ 'b', 'c' ]

性能更好(使用哈希),如果不需要严格的类型相等

// Your main array 
var arr = [ '8','deleted','b','c'];

// This array contains strings that needs to be removed from main array
var removeStr = [ 'deleted' , '8'];
var removeObj = {};  // Use of hash will boost performance for larger arrays
removeStr.forEach( e => removeObj[e] = true);

var res = arr.filter(function(val){
  return !removeObj[val]
})

console.log(res);

// 'arr' Outputs to :
[ 'b', 'c' ]

标准答案可能如下所示:

[10'已删除',20'已删除'].过滤器(x=>x!=='deleted');
//=> [10, 20]
这里没有什么意外;任何开发人员都可以阅读、理解和维护此代码。从这个角度来看,这个解决方案很好。我只想提供一些不同的观点

首先,当条件为“反向”时,我有时会与过滤器的语义发生冲突:

[2,3,2,3]。过滤器(x=>x==2);
[2,3,2,3]。过滤器(x=>x!==2);
这是一个人为的例子,但我敢打赌一些读者确实停顿了一纳秒。从长远来看,这些小小的认知障碍可能会让人筋疲力尽

我个人希望有一种拒绝方法:

[2,3,2,3]。过滤器(x=>x==2);
[2,3,2,3]。拒绝(x=>x==2);
其次,这个表达式中有很多“机械”:一个函数表达式、一个参数和一个等式检查

这可以通过使用curried函数进行抽象:

const-eq=
x=>y=>
x==y;
[2,3,2,3]。滤波器(等式(2));
//=> [2, 2]
我们可以看到,
eq(2)
x=>x==2
相同,只是较短,并且添加了语义

现在,让我们构建一个
reject
函数并使用
eq

const拒绝=
(pred,xs)=>
xs.filter(x=>
pred(x)==false);
拒绝(等式(2),[2,3,2,3]);
//=> [3, 3]
但如果我们需要拒绝其他东西呢?我们可以构建一个使用
eq
函数:

const=
(…xs)=>y=>
xs.some(等式(y));
拒绝(第(1,2),[1,3,2,3]);
//=> [3, 3]
最后回答你的问题:

拒绝(eq('deleted'),[1,'deleted',3]);
//=> [1, 3]
拒绝(无论是('deleted'、'removed')、[1'deleted',3'removed',5]);
//=> [1, 3, 5]
我们可以根据不同的谓词进一步删除,例如,如果匹配字符串“delete”或为0,则删除

让我们构建一个
eitherfn
函数,该函数接受谓词列表:

const eitherfn=
(…fn)=>y=>
fn.一些(f=>
f(y));
现在让我们构建一个
match
函数:

常量匹配=
x=>y=>
y的类型==“字符串”
? y、 包括(x)
:假;
然后:

reject(eitherfn(匹配('delete'),等式(0)),[0,1',deleted',3',will delete',5])
// [1, 3, 5]

使用箭头语法甚至更好<代码>数组.过滤器(a=>a!==“已删除”)如果要删除包含部分搜索词的元素,您将如何修改此选项<代码>获取此数组[1,2,‘删除’,4,5,‘删除’,6,‘将删除’]
。如果要删除与字符串“del”的哪怕部分匹配的任何元素,该怎么办?那么“delete”、“deleted”和“will delete”都被删除了吗?@user1837608在这一点上,处理正则表达式匹配比处理标准匹配或字符串中n个元素的匹配更安全,但这将是一个昂贵的操作,在这一点上没有真正的好处,因为它会用“will delete”将自身弄得一团糟,如果需要,我可以在下面给出答案,但与我相信的问题并不直接匹配。
// Your main array 
var arr = [ '8','abc','b','c'];

// This array contains strings that needs to be removed from main array
var removeStr = [ 'abc' , '8'];

arr = arr.filter(function(val){
  return (removeStr.indexOf(val) == -1 ? true : false)
})

console.log(arr);

// 'arr' Outputs to :
[ 'b', 'c' ]
// Your main array 
var arr = [ '8','deleted','b','c'];

// This array contains strings that needs to be removed from main array
var removeStr = [ 'deleted' , '8'];
var removeObj = {};  // Use of hash will boost performance for larger arrays
removeStr.forEach( e => removeObj[e] = true);

var res = arr.filter(function(val){
  return !removeObj[val]
})

console.log(res);

// 'arr' Outputs to :
[ 'b', 'c' ]