如何在JavaScript中从数组中删除单个实例?

5

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

数组为:

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

我正在使用Math.max()函数来查找最大值。

k=Math.max(...a)

现在使用 filter() 函数进行筛选。
a=a.filter(e => e!=k);

但它过滤了最大数的两个实例。如何解决?

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

2

以下是两种简单的方法:

第一种使用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
我建议使用“-1”作为起始索引,这样您就不需要先计算数组的长度。 a.sort().splice(-1, 1); - fubar
我将splice更改为使用-1索引,并为完整性添加了pop()方法。 - Ryan Griggs

2

正如你所发现的,.filter()会遍历整个数组,测试每个值是否符合过滤函数的条件。这不是你要完成的任务。

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

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

另外,您可以使用以下方式删除最后一个索引:

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

在“人类语言”中,arr.splice(k, n)的意思是“从索引k开始,移除接下来的n个元素”。
当然,如果您不介意排序(或更改项目顺序)的开销,则可以执行以下操作:
a.sort().pop();

这将对数组进行排序,然后移除最后一个元素,也就是最大值。


0
你可以找到要删除的元素的索引,然后只删除它。 不编写排序,假设您想保留数组的顺序。
因此,这将需要使用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,这将更快。你有什么想法吗?详见 https://dev59.com/O2Eh5IYBdhLWcg3wRBn5 - Ryan Griggs
1
我完全同意你的观点。我目前有一个偏爱不可变性的习惯。在大型应用程序中保持不可变性通常很重要,以使事情更加可预测。话虽如此,如果我们需要更好的性能,我总是愿意重新考虑我的方法。 :) - Jeff P Chacko

0
这是一个功能性版本的任务,不会改变您原始的数组。请查看内联注释以获取说明。

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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接