JS:按值从数组中删除第一个元素

时间:2019-05-29 17:09:14

标签: javascript arrays filter

我有一个数组:

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]

感谢您的帮助。

5 个答案:

答案 0 :(得分:5)

您可以使用findIndexsplice()

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