【问题标题】:How to remove the single instance from an array in javascript? [duplicate]如何从javascript中的数组中删除单个实例? [复制]
【发布时间】:2018-05-10 06:55:43
【问题描述】:

我需要找到最大数量然后将其从数组中删除。(仅单个实例)

让数组为

a=[91,65,91,88,26]

我正在使用 Math.max()

找到最大值
k=Math.max(...a)

现在使用 filter()

a=a.filter(e => e!=k);

但它过滤了最大数量的两个实例。

如何解决?

【问题讨论】:

  • 为什么不直接“排序”数组,然后使用“拼接”方法删除最后一个元素?
  • @Ryan Griggs 这是个好主意,但我认为他应该使用pop 而不是delete
  • 编辑了我的答案以使用 Splice,但 Pop 也很好用。
  • @RyanGriggs 谢谢你,你现在可以发布你的答案了 :)

标签: javascript arrays ecmascript-6


【解决方案1】:

这里有两种简单的方法:

使用 splice() 的第一种方式

a=[91,65,91,88,26];
a = a.sort();
a.splice(-1, 1);
console.log(a);

// Array [ 26, 65, 88, 91 ]

第二种方式使用pop()

a=[91,65,91,88,26];
a = a.sort();
a.pop();
console.log(a);

// Array [ 26, 65, 88, 91 ]

【讨论】:

  • 我建议使用-1 作为起始索引,这样您就不需要先计算数组的长度。 a.sort().splice(-1, 1);
  • 为了完整起见,我将拼接改为使用 -1 索引,并添加了 pop() 方法。
【解决方案2】:

正如您所发现的,.filter() 迭代整个数组,根据您的过滤器函数测试每个值。这不是您明确提出的任务。

删除单个元素的关键是.splice()。您的任务只是告诉 splice 要删除哪些项目:

a.splice(a.indexOf( k ), 1);

或者,您可以删除最后一个索引:

a.splice(a.lastIndexOf( k ), 1);

在“human”中,arr.splice(k, n) 读作“从索引 k 开始,删除下一​​个 n 个元素。”

当然,如果您不介意排序(或更改项目顺序!)的开销,那么您可以执行以下操作:

a.sort().pop();

这将对数组进行排序,然后删除最后一个元素——也是最大的。

【讨论】:

    【解决方案3】:

    您可以找到要删除的元素的索引,然后将其删除。 假设您希望保留数组的顺序,则不编写 Sort。

    所以这需要使用findIndex

    k=Math.max(...a)
    i=a.findIndex(el => el === k)
    newArray = [...a.slice(0, i), ...a.slice(i+1)]
    

    以我所做的方式使用数组切片还可以确保我们不会更改初始数组。
    虽然我不建议将它用于非常大的数组。
    您可以通过编写自己的函数来完成所有这些操作,从而获得最佳性能。

    【讨论】:

    • 如果 Math.max() 和 findIndex() 都具有 O(n) 复杂度,那么每个 slice() 也将具有 O(n) 复杂度,因为它们需要遍历原始数组,复制到新数组……那不是 O(4n) 吗? javascript sort() 方法的复杂度因浏览器而异,但我们可以假设 O(n log n)。然后 pop() 应该是 O(1) 因为我假设它只是取消链接最后一个元素或将内部计数器减少 1。这会快得多。你的意见?见stackoverflow.com/questions/22614237/…
    • 我完全同意你的看法。我目前有这种支持不变性的习惯。并且保持不变性对于使大型应用程序中的事情更加可预测通常很重要。也就是说,如果我们需要更多性能,我总是愿意重新考虑我的方法。 :)
    【解决方案4】:

    这是一个不会改变原始数组的任务的功能版本。请参阅内联 cmets 以获得解释。

    const a = [91,65,91,88,26]
    
    // return the max out of two numbers
    const max = (x, y) => x > y ? x : y
    
    const removeMax = a => {
      // find the largest value in the array with reduce
      const largest = a.reduce(max, 0)
      // get the first index of the largest number
      const index = a.indexOf(largest)
      // return a new array without the largest number
      return [
        ...a.slice(0, index),
        ...a.slice(index + 1)
      ]
    }
    
    console.log('before', a)
    
    console.log('after', removeMax(a))
    <script src="https://codepen.io/synthet1c/pen/KyQQmL.js"></script>

    【讨论】:

      猜你喜欢
      • 2020-02-12
      • 1970-01-01
      • 2011-04-26
      • 2012-06-17
      • 2020-08-16
      • 2011-03-24
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多