将嵌套数组最大值减少到单个数组



我正在尝试找到一种方法将嵌套数组中特定位置/索引的最大值减少到单个数组中。

鉴于:

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#reduceMath.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;
});

currentprevious都是数组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和将数组作为参数轻松完成)。

最新更新