我正在尝试找到一种方法将嵌套数组中特定位置/索引的最大值减少到单个数组中。
鉴于:
const myArr = [[105,87,171],[113,192,87],[113,87,87],[113,87,87]]
预期返回值:
[113,192,171]
实际返回值:
[113,87,87]
使用以下代码,我得到了上面的返回值。
const highest = myArr.reduce((previous, current) => {
return current > previous ? current : previous;
});
为什么我只获取第一个位置的最大值,而不是嵌套数组的其余两个位置?
以下是使用Array#reduce
和Math.max
方法执行此操作的方法:
const myArr = [[105,87,171],[113,192,87],[113,87,87],[113,87,87]],
output = myArr.reduce(
([x,y,z],[a,b,c]) =>
[
Math.max(x,a),
Math.max(y,b),
Math.max(z,c)
]
);
console.log( output );
或者。。。
您可以将Array#map
添加到组合中以创建更通用的解决方案:
const myArr = [[105,87,171],[113,192,87],[113,87,87],[113,87,87]],
output = myArr.reduce(
(acc,cur) =>
cur.map((c,i) => Math.max(c, acc[i]))
);
console.log( output );
所以。。。
重写您的解决方案....
const myArr = [[105,87,171],[113,192,87],[113,87,87],[113,87,87]];
const highest = myArr.reduce((previous, current) => {
return current.map((cur,i) => cur > previous[i] ? cur : previous[i]);
});
console.log( highest );
您需要按索引比较子数组中的元素。
const myArr = [[105,87,171],[113,192,87],[113,87,87],[113,87,87]]
const highest = myArr.reduce((previousArr, currentArr) => {
return previousArr.map((item, index) =>
Math.max(item, currentArr[index])
)
});
console.log(highest)
为什么我只获得第一个位置的最大值,而不是嵌套数组的其余两个位置?
因为在您的代码中:
const highest = myArr.reduce((previous, current) => {
return current > previous ? current : previous;
});
current
和previous
都是数组myArr
的单个元素 - 这意味着它们本身就是 3 元素数组。你基本上是在计算最大数组 - 这并没有真正的意义,尽管Javascript的类型强制总是会找到一些。我相信在这里它将数组转换为字符串,这实际上意味着它将返回具有"最高"第一个元素的元素,然后是"最高"的第二个元素(如果并列),依此类推,其中"最高"将在比较为字符串时。我可能是错的,但无论如何请注意,返回值确实是数组中的子数组之一 - 这显然不是您需要的。
如果你想通过单个reduce
调用来计算它 - 因为只遍历数组一次是性能最高的,尽管这在实践中对于只有 3 个元素的数组并不重要 - 你必须跟踪你在 3 个索引中的每一个的最大值。所以它看起来像这样:
const myArr = [[105,87,171],[113,192,87],[113,87,87],[113,87,87]];
const highest = myArr.reduce((previous, current) => {
const highest0 = Math.max(previous[0], current[0]);
const highest1 = Math.max(previous[1], current[1]);
const highest2 = Math.max(previous[2], current[2]);
return [highest0, highest1, highest2];
});
console.log(highest);
尽管如果性能不是问题并且可读性是优先考虑的,您可能更愿意简单地map
数组 3 次,以便为 3 个位置中的每个位置获取一个数组,然后找到每个数组的最大值(您可以使用Math.max
和将数组作为参数轻松完成)。