3 回答

TA贡献1805条经验 获得超10个赞
您可以决定从哪里开始(在这种情况下索引为零),然后设置一个 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 之间反弹。

TA贡献1815条经验 获得超10个赞
您也可以通过单个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)

TA贡献1851条经验 获得超3个赞
一种选择是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);
添加回答
举报