我需要找到最大数字然后从数组中删除它。(只有单个实例)
让数组
a=[91,65,91,88,26]
我使用 Math.max()
找到最大值k=Math.max(...a)
现在使用 filter()
a=a.filter(e => e!=k);
但它过滤了最大数量的实例。
如何解决?
答案 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;