javascript - 在 for 循环中使用临时变量

标签 javascript for-loop performance

我正在编写一个函数来随机排列数组中的项目:

this.shuffle = function () {
    ...

首先,我得到数组的两半并设置第三个空数组:

    this.leftHalf = this.cards.slice(0, this.size() / 2);
    this.rightHalf = this.cards.slice(this.size() / 2);
    this.result = [];

接下来,我将每一半中的一张牌放入结果数组中:

    for (var i = ...) {
        this.result.unshift(this.leftHalf[i]);
        this.result.unshift(this.rightHalf[i]);
    }

最后,我将结果数组分配给原始数组并删除“临时”变量:

    this.cards = this.result;

    delete this.leftHalf;
    delete this.rightHalf;
    delete this.result;
}

我的问题:这是解决这个问题的明智方法,还是有更好的方法而不涉及设置临时变量?我考虑过使用私有(private)变量(但不确定它是否会提高性能),如下所示:

var leftHalf, rightHalf, result;

this.shuffle = function () {
    leftHalf = ...

只是好奇我是否做错了什么明显的事情,或者在这些情况下是否有最佳实践。

最佳答案

你可以在没有任何私有(private)变量和一个循环的情况下完成它,尽管我怀疑会有很大的性能差异。假设您想要左手洗牌,因此顶部的牌最终位于顶部,中间的牌位于第二位,并且牌组的长度为偶数 N...

for(var i=...) {
   if(i%2 == 1) 
      newdeck[i] = oldeck[N/2+(i-1)/2];
   if(i%2 == 0) 
      newdeck[i] = oldeck[i/2];
}

这将像您的原始算法一样进行所谓的完美洗牌,但正如人们所说,这不是随机的,因为它是可预测的。有一篇著名的论文说,要从有序的牌组中得到看似随机的牌组,您需要进行 7 次完美的洗牌。您还可以使用左右洗牌来控制牌组中的牌,如 this article 所示。 .

关于javascript - 在 for 循环中使用临时变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11712804/

相关文章:

java - 如何允许用户将负数输入数组并更改起始索引?

javascript - 压缩效率

java - 从 String-Json 对象中获取值

javascript - 如何捕获来自 browserify 的所有错误?

javascript - 为图像容器超链接附加字符串添加淡入淡出效果

java - Java 中 Atoi 表示负值

mysql - 标量子查询是否针对 MySQL 中的每个连接执行 where 条件?

javascript - 从类构造函数中的另一个属性引用属性的值

java - 如何在JSP中使用d3.js?

php - 遍历数据库查询