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' ]