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

时间:2019-06-19 22:14:27

标签: javascript arrays

说我有一个[5,4,0,3,1,6,2]数组。我在索引0处获取第一个元素,其值为5。接下来,我想找到索引为5的元素,该元素对应于值6。然后,我想在索引6处查找该值,即是2,则2点等于0,我们回到起点,所以我们停了下来。

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

3 个答案:

答案 0 :(得分:1)

您可以决定从哪里开始(在这种情况下,索引为零),然后设置一个while循环,该循环打印当前值,然后将当前值设置为该索引处的数组查找。当数组查找返回undefined时停止。如果需要计数,可以在循环时维护一个计数器变量:

let arr = [5,4,0,3,1,6,2]
let start = arr[0]
let seen = new Set();
let count = 0
while (start != undefined && !seen.has(start)){
    console.log(start)
    seen.add(start)
    count++
    start = arr[start]
}
console.log("Count:", count)

您还可以保留一组访问索引,以帮助避免周期。在这种情况下,如果您从索引1开始,它将在1到4之间跳动。

答案 1 :(得分:0)

一个选项是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 {
  usedIndicies.add(nextIndex);
  nextIndex = arr[nextIndex];
  count++;
} while (!usedIndicies.has(nextIndex) && nextIndex < arr.length);
console.log(count);

答案 2 :(得分:0)

您也可以通过单个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中的 first 元素开始:

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)