此问题的目的是遍历列表,找到列表中的最大值,然后报告最高值的索引值。我能够使用两个for循环来解决这个问题:
var scores = [60, 50, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 44, 18, 41, 53, 55, 61, 51, 44];
var highscore = 0;
var highscoreSolutions = [];
for (var i = 0; i < scores.length; i++){
if (scores[i] > highscore){
highscore = scores[i];
}
}
for (var i = 0; i < scores.length; i++){
if (scores[i] == highscore){
highscoreSolutions.push(i);
}
}
console.log(highscore);
console.log(highscoreSolutions);
我最初尝试使用一个for循环来解决这个问题,但是我遇到了一个类似的初始化问题,也就是说,无论如何,第一个索引值将包含在最高得分列表中:
var scores = [60, 50, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 44, 18, 41, 53, 55, 61, 51, 44];
var highscore = 0;
var highscoreSolutions = [];
for (var i = 0; i < scores.length; i++){
if (scores[i] >= highscore){
highscore = scores[i];
highscoreSolutions.push(i);
}
}
console.log(highscore);
console.log(highscoreSolutions);
我不确定如何解决添加0索引值的问题(不使用两个单独的for循环)。谁能帮我吗?非常感谢!! :)
答案 0 :(得分:3)
当您找到新的最高值时,您需要清除列表:
var scores = [60, 50, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 44, 18, 41, 53, 55, 61, 51, 44];
var highscore = 0;
var highscoreSolutions = [];
var score;
for (var i = 0; i < scores.length; i++) {
score = scores[i];
if (score == highscore) {
highscore = score;
highscoreSolutions.push(i);
} else if (score > highscore) {
highscore = score;
// We have a new highest score, so all the values currently in the array
// need to be removed
highscoreSolutions = [i];
}
}
snippet.log(highscore);
snippet.log(highscoreSolutions.join(", "));
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
答案 1 :(得分:1)
这可能听起来过度设计了你,但是当你似乎在学习JavaScript时,我建议你跳过for
次迭代(好吧,你应该知道它们存在并且它们可以用来循环)并学习使用JavaScript使用functional programming范例(a great interactive tutorial for that),因为它会带来更易读,更不容易出错的代码。
问题的解决方案可以使用[].reduce()
:
function highest(numbers) {
return numbers.reduce(function(winner, current, index) {
if (current > winner.value) {
return {value: current, indices: [index]};
} else if (current === winner.value) {
winner.indices.push(index);
return winner;
} else {
return winner;
}
}, {value: Number.NEGATIVE_INFINITY, indices: []});
}
function highest(numbers) {
return numbers.reduce(function(winner, current, index) {
if (current > winner.value) {
return {value: current, indices: [index]};
} else if (current === winner.value) {
winner.indices.push(index);
return winner;
} else {
return winner;
}
}, {value: Number.NEGATIVE_INFINITY, indices: []});
}
document.querySelector('button').addEventListener('click', function() {
var randoms = new Array(100).join(' ').split('').map(function() {return Math.ceil(Math.random() * 100)});
document.querySelector('#array').innerHTML = JSON.stringify(randoms);
document.querySelector('#result').innerHTML = JSON.stringify(highest(randoms));
});
&#13;
<button>run</button>
<h3>the array</h3>
<pre id="array"></pre>
<h3>the result</h3>
<pre id="result"></pre>
&#13;
答案 2 :(得分:0)
var scores = [60, 50, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 44, 18, 41, 53, 55, 61, 51, 44];
//clone array keeping original as scores, sort the new cloned array, grab the max value
var highscore = scores.slice(0).sort()[scores.length - 1];
var highscoreSolutions = [];
//find occurances of highscore and push to array
for (var i = 0; i < scores.length; i++){
if (scores[i] == highscore){
highscoreSolutions.push(i);
}
}
alert('highscore: ' + highscore + '\nindexes: ' + highscoreSolutions)
您可以使用Array.slice(0)
克隆数组然后运行sort()并通过检查长度-1
获取新排序数组的最后一个值然后迭代循环以找到高分数所在的索引。