我有一个for循环将一个大数组中的随机数量的唯一元素推送到另一个小数组中。我想要将确切数量的元素推入到那个小数组中。
$scope.word_pair = [
{'word':'Carla', 'pair':'Lion'},
{'word':'Sophie', 'pair':'Lotta'},
{'word':'Jannes', 'pair':'Stubbi'},
{'word':'Martin', 'pair':'Wolle'},
{'word':'Flo', 'pair':'Ign'},
{'word':'Rere', 'pair':'Rose'},
{'word':'Jean', 'pair':'Tamara'},
{'word':'Memo', 'pair':'Elk'},
{'word':'Nila', 'pair':'Naph'}
];
/* To select limited random items to display */
var displayCount = 3 //count should change at each level
$scope.randomWord_pair = []
var numbers = [];
for (var i = 0; i <= displayCount; i++) {
var randomNumber = Math.floor(Math.random() * 4);
if (numbers.indexOf(randomNumber) == -1) {
numbers.push(randomNumber);
$scope.randomWord_pair.push($scope.word_pair[randomNumber])
}
}
此处displayCount
决定我的randomWord_pair
数组中需要多少(确切)数量的元素。但是,有时它给了我randomWord_pair
数组中除3个元素之外的其他元素。
我该如何解决?
答案 0 :(得分:3)
有两个原因:
你循环太多了。 i = 0; i <= displayCount; i++
会为displayCount = 3
提供四次次迭代,而不是三次:i
将为0,然后是1,然后是2,然后是3.
你的循环不够。 :-)如果你没有找到它,你只是推送一个数字,这意味着你并不总是按一个数字进行循环迭代。
只需使用
while ($scope.randomWord_pair.length < displayCount)
您在评论中说过,代码也遗漏了一些单词对,并且您添加了$scope.word_pairs
的代码。
$scope.word_pairs
有九个条目(索引0到8,包括0和8),但您的随机数代码:
var randomNumber = Math.floor(Math.random() * 4);
...只会给你0到3(含)的值。如果您希望将所有九个可能的索引都放入word_pairs
,则需要:
var randomNumber = Math.floor(Math.random() * $scope.word_pairs.length);
// -------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^