let massive = [
["Mallory", "Everest", "Mont Blanc", "Pillar Rock"],
["Mawson", "South Pole", "New Hebrides"],
["Hillary", "Everest", "South Pole"]
];
function func(massive) {
let toponymes = [];
let explorers = [];
let result = [];
for (let i = 0; i < massive.length; i++) {
explorers = [...explorers, massive[i][0]]
// выписываем всех исследователей
massive[i].map((topo) => {
if (massive[i][0] != topo) {
toponymes = [...toponymes, topo]
// выписываем все топонимы
}
})
}
toponymes = [...new Set(toponymes)]; //исбавляемся от дубликатов
toponymes.map((t, id) => {
for (let i = 0; i < massive.length; i++) {
massive[i].map((m) => {
if (m == t) {
if (result[id] === undefined) {
result[id] = [toponymes[id], explorers[i]]
} else {
result[id] = [...result[id], toponymes[id], explorers[i]]
}
result[id] = [...new Set(result[id])];
}
})
}
})
console.log(result)
return (result)
}
func(massive)
上面的代码有两部分:
1. 独特的研究人员和地名分别识别
考虑第一部分:
这里又分为两部分。
填充
explorer:在这种情况下,只需简单地使用就足够了push,无需不断复制数组,只需向其中添加一个元素填充
toponymes:如果你看数组,你会注意到除了第一个元素之外的所有元素都是地名,所以检查和遍历所有元素是没有意义的,你可以立即获取除第一个元素之外的所有元素,例如,使用slice结果,代码可能如下所示
或者,如果我们使用解构和循环
for..of,即使如此2. 搜索访问过地名的研究人员。
考虑第二部分:
引起您注意的第一件事是不正确地使用
.map. 此方法允许您基于旧集合创建新集合,但在这种情况下,它用作循环for。相反,代码应该是这样的:映射规则很简单:每个元素
t对应一个数组,以这个元素开头。接下来,您需要过滤访问过该地点的研究人员列表。这可以通过多种方式完成,例如
在这种情况下,使用该方法
filter,只选择那些访问过该地点的研究人员t。explorers 数组中元素的顺序对应于海量的顺序,因此选择一个数组来检查位置归结为通过索引获取元素。因此,代码采用以下形式:
组装示例:
另一种解决方案可能是一种方法,将数组一次性折叠成一个对象,其中包含地名和值的键 - 人员列表。对于卷积,它使用
.reduce当然,这完全是口味问题......如果目标是可读性,目前我会这样做:
那些。如果该函数适用于数据,首先我至少要注意它是什么类型的数据——这样我就不必每次都爬上去看看它来自哪里以及它包含什么。在主要功能中 - 也是预期的结果。
Ps 同时,Object.entries() - 一个循环,map() - 第二个循环,concat() - 第三个循环,+解构的成本[地点,人员]。
在实际代码中,您还需要考虑大数据是如何到达的,以及从什么时候开始切换到更优化的变体。混淆的精灵代码总是可以用注释来补偿。