我有一个数组:
arr = [50, 40, 50, 50];
我需要删除第一个等于50的元素,并且不要触摸另一个。
此代码仅返回[40]
。
arr = arr.filter(function(e) {return e !== 50}) // [40]
但是我需要
arr = arr.somefunction(function(e) {return e !== 50}) // [40, 50, 50]
感谢您的帮助。
答案 0 :(得分:5)
您可以使用findIndex
和splice()
let arr = [50, 40, 50, 50];
arr.splice(arr.findIndex(a => a === 50), 1);
console.log(arr)
如果需要在数组的prototype
上使用它,则可以定义自定义方法。
function removeFirst(cb){
for(let i = 0;i<this.length;i++){
if(cb(this[i],i,this)){
return this.slice(0,i).concat(this.slice(i+1));
}
}
return this;
}
Object.defineProperty(Array.prototype,'removeFirst',{
value:removeFirst
})
let arr = [50,40,50,50];
let res = arr.removeFirst(x => x === 50);
console.log(res)
答案 1 :(得分:1)
您可以带一个标志并将其更改为找到的第一个值。
var array = [40, 40, 50, 40, 50, 40, 50],
found = false;
array = array.filter(v => found || !(found = v === 50));
console.log(array);
使用计数器,您可以指定要过滤的值的数量。
var array = [40, 40, 50, 40, 50, 40, 50],
count = 1;
array = array.filter(v => !count || (count -= v === 50));
console.log(array);
答案 2 :(得分:1)
findIndex()返回所提供函数的首次出现的索引。 之后,您可以使用splice()删除元素。
let arr = [50, 40, 50, 50];
arr.splice(arr.findIndex(function(e) {return e === 50}), 1);
console.log(arr);
答案 3 :(得分:0)
您可以使用变量来跟踪是否删除了任何值
let deleteFirst = (value) => {
let arr = [50, 40, 50, 50];
let del = false
return arr.filter(val=> {
if(val === value && !del){
del = true
return false
}
return true
})
}
console.log(deleteFirst(50))
console.log(deleteFirst(40))
答案 4 :(得分:0)
这是一个咖喱函数。它不会修改原始数组,而是返回一个新数组:
const removeFirst = (val) => ( xs = [], idx = xs .indexOf (val) ) => idx > -1
? xs .slice (0, idx) .concat ( xs .slice (idx + 1) )
: xs
console .log (
removeFirst (50) ([50, 40, 50, 50])
)
如果您喜欢用remove(50, [50, 40, 50, 50])
来称呼它,则只需更改第一行:
const removeFirst = (val, xs = [], idx = xs .indexOf (val) ) => idx > -1
? xs .slice (0, idx) .concat ( xs .slice (idx + 1) )
: xs