用于完全迭代的循环的Javascript

时间:2016-07-17 09:38:48

标签: javascript angularjs

我有一个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个元素之外的其他元素。

我该如何解决?

1 个答案:

答案 0 :(得分:3)

有两个原因:

  1. 你循环太多了。 i = 0; i <= displayCount; i++会为displayCount = 3提供四次次迭代,而不是三次:i将为0,然后是1,然后是2,然后是3.

  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);
    // -------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^