【问题标题】:javascript weird console logsjavascript奇怪的控制台日志
【发布时间】:2020-03-09 02:57:18
【问题描述】:

我有一个分配函数,它为您提供一个排序数组,其中包含从 1 到 45 的 6 个随机数。所有数组值都不应该彼此相等。

我想过一个可以在 Java 中运行的解决方案,但我得到的 JavaScript 控制台日志非常混乱。谁能帮帮我?

"use strict";

var numbers = [];
for(var x = 1; x <46;x++){
    numbers.push(x);
}


function LottoTipp(){
    var result = [];

    for(var i = 0; i <6; i++){
      var randomNum = Math.round(Math.random()* 45);
      var pushed = numbers[randomNum];
      result.push(pushed);
      numbers.splice(randomNum)
    }

    return console.log(result) + console.log(numbers);

}

LottoTipp(); 

控制台日志

[ 34, 7, undefined, undefined, undefined, undefined ]

[ 1, 2, 3, 4, 5, 6 ]

【问题讨论】:

  • 你没有正确使用splice
  • 另外,既然你把它加回来了,Java有什么关系?
  • 你的splice搞砸了,应该是splice(index, number of delete items)
  • 只需添加 splice(randomNum, 1) 并输出 (6) [33, 7, 25, 24, 26, 28] (39) [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 27, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39、40、41、42、43、44、45]
  • 仍然,您的逻辑不正确,因为随机数最终可能会产生相同的数组。另外,splice 会修改原始数组,所以在开始拼接之前需要复制一份。

标签: javascript


【解决方案1】:

如果它是唯一的,只需在结果中添加数字,否则取出一个新数字,然后对其进行排序。这是一个实现:

let result = []
while(result.length < 6) {
    let num = Math.round(Math.random() * 45);
    if(!result.includes(num)) {
        result.push(num);
    }
}
result.sort((a,b) => {
    return parseInt(a) - parseInt(b);
});
console.log(result);

【讨论】:

  • 欢迎来到Stack Overflow。虽然它可能会回答问题,但尽量不要只是粘贴代码,而是要给出解释。
  • 本网站上通常不赞成仅使用代码的答案。您能否编辑您的答案以包含一些 cmets 或对您的代码的解释?解释应该回答这样的问题:它有什么作用?它是如何做到的?它去哪儿了?它如何解决OP的问题?请参阅:How to anwser。谢谢!
【解决方案2】:

存在三个问题:

  • 如果你想删除一个数组中的一项,你必须通过index 的项来splice 它并给出一个删除计数。

    在你的情况下:numbers.splice(randomNum, 1);

  • 您必须使用Math.floor 而不是Math.round,因为Math.floor 总是向下到最接近的整数,而Math.round 搜索可能高于numbers.length 的最接近的整数。

  • 删除一项后,数组的length 已更改。所以你必须乘以 numbers.lenght 而不是 45。

    在你的情况下:var randomNum = Math.floor(Math.random()* numbers.length);

"use strict";

var numbers = [];
for(var x = 1; x < 46; x++){
    numbers.push(x);
}


function LottoTipp(){
    var result = [];

    for(var i = 0; i < 6; i++){
      var randomNum = Math.floor(Math.random()* numbers.length);
      var pushed = numbers[randomNum];
      result.push(pushed);
      numbers.splice(randomNum, 1);
    }

    return console.log(result) + console.log(numbers);

}

LottoTipp();

【讨论】:

  • 不应该是var randomNum = Math.floor(Math.random()* numbers.length);
  • 非常感谢!我做到了,但现在控制台显示 TypeError: numbers.lenght is not a function
  • 那是因为它必须是 length 而不是 lenght :)
  • 我必须坚持Math.floor 是正确的。 math.round 导致 undefined 条目,如果你经常点击“运行代码片段”。
  • 还有一点仅供参考:在这种情况下,您不需要使用.indexOf,因为randomNum 已经是您推送的号码的索引。我的错,又更新了。 :)
【解决方案3】:

控制台语句没有问题,问题是您正在修改 for 循环中的 numbers 数组。当您在此语句中选择 1-45 之间的随机数时:-

var randomNum = Math.round(Math.random()* 45);

并且您希望该值将出现在该随机索引处的 numbers 数组中。但是,您正在使用 array.splice() 并且只为函数提供第一个参数。第一个参数是要开始删除元素的起始索引,找到语法here。这将导致删除数组中的所有下一个值。因此,如果您选择一个随机数,例如 40,则 numbers[40] 的值未定义,因为您已删除数组的内容。

如果您想生成一组唯一的数字,请关注post

希望对你有帮助!

【讨论】:

    【解决方案4】:

    如果您只想要一个具有随机唯一数字的数组,我建议您这样做:

    <script>
         var array = [];
         for(i = 0; i < 6; i++) {
            var number = Math.round(Math.random() *45);
            if(array.indexOf(number) == -1) { //if number is not already inside the array
                array.push(number);
            } else { //if number is inside the array, put back the counter by one
                i--;
            }
         }
         console.log(array);
    </script>
    

    【讨论】:

    • 虽然这可能是一个不错的解决方案,但 OP 不会发现自己的代码出了什么问题。所以不会有学习效果。
    • @J.Sadi 是对的,但我感谢您对另一种方法的帮助和观点来完成这项任务。谢谢你:)
    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2011-10-11
    相关资源
    最近更新 更多