Javascript上的indexOf无法在数组上按预期方式工作

时间:2019-06-25 11:10:41

标签: javascript

我想遍历一个数组以找到其上最高编号的索引,然后将这些索引编号写到另一个新的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)的位置。

有人可以向我解释发生了什么吗?我进行了搜索,但无法提出问题。非常感谢。

5 个答案:

答案 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)

正如其他人已经提到的,indexOffindIndex总是返回第一个匹配项的索引。但是不需要使用任何一种,因为您可以像这样访问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将不起作用。只需looppush,然后将值的索引等于新的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