如何在JavaScript中不可变地改组数组?

时间:2018-04-26 07:16:49

标签: javascript arrays immutability

我知道"如何在JavaScript中对数组进行洗牌已经存在问题了#34;但我没有找到一个关于如何以不可变的方式改组阵列的具体问题。那么,什么是在JavaScript中不可变地改组数组的最好方法呢?

也许从https://stackoverflow.com/a/2450976/3022127得到答案,只是先复制数组(在方法内部)是最好的方法?

也许是这样的:

const shuffleArray = (arr) => {
  return arr
    .map(a => [Math.random(), a])
    .sort((a, b) => a[0] - b[0])
    .map(a => a[1])
}

(似乎非常随机https://jsfiddle.net/Lpy22x4c/1/

2 个答案:

答案 0 :(得分:1)

首先复制数组,然后在适当位置进行随机播放很有意义,是的。

或者,可以轻松调整the question you linked中的实现以创建新数组,使旧数组保持不变。主要的变化是获取currentIndex的元素:如果新数组有新数组,我们希望从新数组中获取它,如果没有,我们想从旧数组中获取它。



function shuffle(array) {
  var newArray = [];
  var currentIndex = array.length, temporaryValue, randomIndex;

  // While there remain elements to shuffle...
  while (0 !== currentIndex) {

    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // And swap it with the current element.
    if (newArray.hasOwnProperty(currentIndex)) {
      temporaryValue = newArray[currentIndex];
    } else {
      temporaryValue = array[currentIndex];
    }
    newArray[currentIndex] = array[randomIndex];
    newArray[randomIndex] = temporaryValue;
  }

  return newArray;
}

// Used like so
var arr = [2, 11, 37, 42];
console.log("shuffled", shuffle(arr));
console.log("original", arr);

.as-console-wrapper {
  max-height: 100% !important;
}




答案 1 :(得分:-1)

只需使用此解决方案,但在进行改组之前设置一个等于数组的新变量:How can I shuffle an array?

所以它看起来像:

 /**
 * Shuffles array in place.
 * @param {Array} a items An array containing the items.
 */
function shuffle(oldArray) {
  var j, x, i;
  var newArray = oldArray;
  for (i = newArray.length - 1; i > 0; i--) {
    j = Math.floor(Math.random() * (i + 1));
    x = newArray[i];
    newArray[i] = newArray[j];
    newArray[j] = x;
   }
   return newArray;
  }