【问题标题】:JS: delete first element from array by valueJS:按值从数组中删除第一个元素
【发布时间】:2019-05-29 17:09:13
【问题描述】:

我有一个数组:

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]

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • arr.splice(0, 1); 它改变了数组本身并将删除的元素作为新数组返回。

标签: javascript arrays filter


【解决方案1】:

您可以使用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)

【讨论】:

  • @KateGurman 如果对您有用,请考虑接受答案。
  • 注意:如果数组中不存在项,则删除第一项!考虑检查findIndex 结果不是-1,然后使用splice
【解决方案2】:

findIndex() 返回所提供函数第一次出现的索引。 之后,您可以使用 splice() 删除元素。

let arr = [50, 40, 50, 50];
arr.splice(arr.findIndex(function(e) {return e === 50}), 1);
console.log(arr);

【讨论】:

    【解决方案3】:

    您可以取一个标志并更改它的第一个值。

    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);

    【讨论】:

      【解决方案4】:

      您可以使用变量来跟踪您是否删除了任何值

      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))

      【讨论】:

        【解决方案5】:

        这里有一个柯里化函数。它不会修改您的原始数组,而是返回一个新数组:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-23
          • 2017-02-25
          • 2012-04-19
          • 1970-01-01
          • 2016-10-31
          • 2020-05-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多