我想遍历一个数组以找到其上最高编号的索引,然后将这些索引编号写到另一个新的Array上。
我想到了以下代码:
let scores = [60, 50, 60, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 61, 46, 31, 57, 52, 44, 18, 41, 53, 55, 61, 51, 44];
let highestScore = Math.max(...scores);
let topScores = [];
for (score of scores) {
if (score == highestScore) {
topScores.push(scores.indexOf(score));
}
}
console.log(topScores);
然后控制台显示的结果是:
topScores = [11, 11]
...当我期望的时候:
topScores = [11, 18]
,因为这些是得分数组上最高数字(均为69)的位置。
有人可以向我解释发生了什么吗?我进行了搜索,但无法提出问题。非常感谢。
答案 0 :(得分:1)
如 Fritz 所述,Array.indexOf(x)
始终返回x在数组中的第一个位置。第一个69
位于索引11
。
您可以使用Array.forEach()
代替for...of
:
let scores = [60, 50, 60, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 61, 46, 31, 57, 52, 44, 18, 41, 53, 55, 61, 51, 44];
let highestScore = Math.max(...scores);
let topScores = [];
scores.forEach((score, index) => {
if (score == highestScore) {
topScores.push(index);
}
})
console.log(topScores);
答案 1 :(得分:0)
这是因为indexOf
总是返回数组中存在元素的第一个索引。您可以使用reduce()
let scores = [60, 50, 60, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 61, 46, 31, 57, 52, 44, 18, 41, 53, 55, 61, 51, 44];
let highestScore = Math.max(...scores);
let res = scores.reduce((ac,a,i) => (a === highestScore && ac.push(i),ac),[])
console.log(res)
答案 2 :(得分:0)
正如其他人已经提到的,indexOf
和findIndex
总是返回第一个匹配项的索引。但是不需要使用任何一种,因为您可以像这样访问for..of
中的当前索引:
for (const [index, score] of scores.entries())
这使您可以轻松完成
topScores.push(index);
let scores = [60, 50, 60, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 61, 46, 31, 57, 52, 44, 18, 41, 53, 55, 61, 51, 44];
let highestScore = Math.max(...scores);
let topScores = [];
for (const [index, score] of scores.entries()) {
if (score == highestScore) {
topScores.push(index);
}
}
console.log(topScores);
答案 3 :(得分:0)
.indexOf()
仅返回特定的第一次出现的索引,而忽略另一个indexes
,因此在这种情况下,indexOf
将不起作用。只需loop
到push
,然后将值的索引等于新的array
let scores = [60, 50, 60, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 61, 46, 31, 57, 52, 44, 18, 41, 53, 55, 61, 51, 44];
let noReplica = Math.max(...scores)
let ret = [];
for (let i = 0, length = scores.length; i < length; i++) {
if (scores[i] === noReplica) {
ret.push(i)
}
}
console.log(ret)
答案 4 :(得分:0)
scores.indexOf(score)始终返回分数在分数中的第一位。
如果需要索引,请使用以下代码。
dev_dependencies:
flutter_test:
sdk: flutter
flutter:
assets:
- images/app_logo.png