给定一个维度为 [x][y][z] 的 3D 数组(我知道我的代码有 2D 数组),如何在不使用循环的情况下找到 [][][n] 的最小值和最大值,其中 0 < n < z



var people = [
["Joe", 27, "US"],
["Mark", 34, "UK"],
["Alex", 22, "PK"]
];
document.write(people[1][1]);

给定一个多维数组,如何在不使用循环的情况下找到[][][n]的最小值和最大值,0 < n < z和那个?

我建议你将问题分成两部分:

  1. 使用flatMap将内部(z(数组中的所有值放入一个列表中
  2. 查找结果列表的最小值/最大值

flatMap有许多可能的实现。甚至计划将具有给定深度参数的flatten作为标准数组功能引入浏览器。

我不确定您的"无循环"要求有多严格,但我们稍后会谈到这一点。以下是使用reduceconcatmap对 3d 数组进行flatMap的初始实现。

const flatMap = (f, xs) => xs.reduce(
(acc, ys) => acc.concat(ys.map(zs => f(zs))),
[]
);

使用从zs中检索元素n的函数调用它,您将获得元素列表:

flatMap(zs => zs[1], [ /* .... */ ]); // returns all elements at `n` in the third layer

现在,您可以通过展开或减少来应用Math.minMath.max

const minAge = Math.min(...flatMap(zs => zs[1], [ /* ... */ ]));

在正在运行的示例中:

const data = [
[
["Joe", 27, "US"],
["Mark", 34, "UK"]
],
[
["Alex", 22, "PK"]
]
];
const flatMap = (f, xs) => xs.reduce(
(acc, ys) => acc.concat(ys.map(f)),
[]
);
// Utils
const max = xs => Math.max(...xs);
const min = xs => Math.min(...xs);
const pluck = k => o => o[k];
const minN = n => d => min(flatMap(pluck(n), d));
const maxN = n => d => max(flatMap(pluck(n), d));
const minAge = minN(1);
const maxAge = maxN(1);
console.log(
"min age:", minAge(data),
"max age:", maxAge(data)
)

现在,如果你真的认真对待"无循环",我相信唯一的选择是递归。我们可以将flatMap重写为递归的东西,但它不一定很漂亮......如果这就是您要找的,请在评论中告诉我。

相关内容

  • 没有找到相关文章

最新更新