var people = [
["Joe", 27, "US"],
["Mark", 34, "UK"],
["Alex", 22, "PK"]
];
document.write(people[1][1]);
给定一个多维数组,如何在不使用循环的情况下找到[][][n]
的最小值和最大值,0 < n < z
和那个?
我建议你将问题分成两部分:
- 使用
flatMap
将内部(z
(数组中的所有值放入一个列表中 - 查找结果列表的最小值/最大值
flatMap
有许多可能的实现。甚至计划将具有给定深度参数的flatten作为标准数组功能引入浏览器。
我不确定您的"无循环"要求有多严格,但我们稍后会谈到这一点。以下是使用reduce
、concat
和map
对 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.min
和Math.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
重写为递归的东西,但它不一定很漂亮......如果这就是您要找的,请在评论中告诉我。