Javascript 代码帮助 - 返回错误

Javascript code help - Wrong return

本文关键字:返回 错误 帮助 代码 Javascript      更新时间:2023-09-26

所以我正在研究这个脚本。当我完成它时,它应该用于制作 2 组和 2 组。但无论如何;脚本开头的"input"数组将从我的HTML文件中获取22个不同的输入。作为标准,我给了他们值 1-22。问题是我的两个块"第一个数字"和"第二个数字"效果不佳:它们没有返回正确的数字。因为我希望每个升降机[x]都使用一次!不是2次,不是0次,一次!这些块像其中一些一样返回两次,其中一些甚至没有被使用。那么我该如何解决这个问题呢?

    function Calculate(){
    var elev = [];
    var inputs = document.getElementsByName("txt");
    for(i=0; i<inputs.length; i++) {
    elev[i] = {
        "Value": inputs[i].value,
        "Used": false
    };
}
    function shuffle(elev){
    var len = elev.length;
    for(i=1; i<len; i++){
        j = ~~(Math.random()*(i+1)); 
        var temp = elev[i];
        arr[i] = elev[j];
        arr[j] = temp;
        }
    }
    for(var v=0; v<1; v++) {
        shuffle(elev);
        document.write(elev + '<br/>'n');
    }}

是的,我对编程还是新手,我只是想学习我能学到的东西。

通过做费舍尔-耶茨洗牌解决了问题。

洗牌数组并迭代它的想法是正确的,但是,通过抛硬币比较器进行排序(常见的错误实现;由另一个答案建议)并不是洗牌数组的正确方法; 它会产生非常偏斜的结果,甚至不能保证完成。

除非你愿意获取下划线.js(arr = _.shuffle(arr)),否则建议使用费舍尔-耶茨洗牌:

function shuffle(arr){
  var len = arr.length;
  for(var i=1; i<len; i++){
    var j = ~~(Math.random()*(i+1)); // ~~ = cast to integer
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }
}
...
shuffle(elev);
for(var i=0; i<elev.length; i++){
  //do something with elev[i]
  console.log(elev[i].Value);
}

另外,请注意,对象字段应该是小写的,而不是大写的(value', not 'Value'). Also, the Used' 字段不应该是必需的,因为您现在按顺序迭代。另外,您是否有机会使用值数组?它们似乎是对象中唯一的字段。

另外,不要使用 document.write()。在页面加载后使用时,它不会按预期工作。如果你想在文档中附加一些东西,你讨厌jQuery和其他框架,你不想走很长的路来创建和组合DOM节点,document.body.innerHTML +=仍然比document.write()更好(但仍然考虑附加DocumentFragment s')。

演示:http://jsfiddle.net/honnza/2GSDd/1/

您只获取一次随机数,如果尚未使用它们,则对其进行处理。

我建议洗牌数组(elev.sort(function() {return Math.random()-0.5})),然后只是迭代结果而不用进一步的随机数。