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

时间:2017-11-27 04:47:09

标签: javascript arrays ecmascript-6

我需要找到最大数字然后从数组中删除它。(只有单个实例)

让数组

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

我使用 Math.max()

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

现在使用 filter()

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

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

如何解决?

4 个答案:

答案 0 :(得分: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 :(得分: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();

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

答案 2 :(得分:0)

您可以找到要删除的元素的索引,并将其删除。 假设你想要保留数组的顺序,不写Sort。

因此需要使用k=Math.max(...a) i=a.findIndex(el => el === k) newArray = [...a.slice(0, i), ...a.slice(i+1)]

{{1}}

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

答案 3 :(得分: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>
&#13;
&#13;
&#13;