如何在数组中找到索引等于另一个元素值的元素?

假设我有一个 [5,4,0,3,1,6,2] 数组。我取索引 0 处的第一个元素,其值为 5。接下来,我想找到索引为 5 的元素。这对应于 6 的值。然后我想找到索引 6 处的值,即是 2,然后 2 指向 0,我们又回到了开始,所以我们停止了。

我需要根据索引值喜欢“链”元素,并在我的数组中找到链的长度。在我给定的示例中,它将是 4。我该怎么做?我觉得我在这里错过了一些简单的东西。


月关宝盒
浏览 283回答 3
3回答

holdtom

您可以决定从哪里开始(在这种情况下索引为零),然后设置一个 while 循环来打印当前值,然后将当前值设置为该索引处的数组查找。当数组查找返回时undefined停止。如果你想要计数,你可以在循环时维护一个计数器变量:let arr = [5,4,0,3,1,6,2]let start = arr[0]let seen = new Set();let count = 0while (start != undefined && !seen.has(start)){    console.log(start)    seen.add(start)    count++    start = arr[start]}console.log("Count:", count)您还可以保留一组访问过的索引以帮助避免循环。在这种情况下,如果您从索引 1 开始,它将在 1 和 4 之间反弹。

动漫人物

您也可以通过单个Array.reduce解决这个问题:let arr = [5,4,0,3,1,6,2]let result = arr.reduce((acc, cur, indx, arr) => {  let last = acc[acc.length-1]  !indx ? acc.push(cur) : !last ? null : acc.push(arr[last])  return acc}, [])console.log('result: ', result, 'count: ', result.length)为了进一步简化,您可以始终从 中的第一个元素开始accumulator array:let arr = [5,4,0,3,1,6,2]let result = arr.reduce((acc, cur, _, arr) => {  let last = acc[acc.length - 1]  last ? acc.push(arr[last]) : null  return acc}, [arr[0]])console.log('result: ', result, 'count: ', result.length)此外,如果您愿意,您可以将其作为一行:let arr = [5,4,0,3,1,6,2]let r = arr.reduce((r, c, _, a) =>    (r[r.length-1] ? r.push(a[r[r.length-1]]) : null, r), [arr[0]])console.log('result: ', r, 'count: ', r.length)

皈依舞

一种选择是do/while循环,它不断地重新分配一个nextIndex变量,一旦nextIndex找到重复项,或者一旦nextIndex超出数组范围,就会中断:const arr = [5, 4, 9, 3, 1, 6, 2];let count = 0;let nextIndex = 0;const usedIndicies = new Set();do {&nbsp; usedIndicies.add(nextIndex);&nbsp; nextIndex = arr[nextIndex];&nbsp; count++;} while (!usedIndicies.has(nextIndex) && nextIndex < arr.length);console.log(count);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript