【问题标题】:Randomly selecting elements in an array only once each while keeping track of their original position - JavaScript随机选择数组中的元素一次,同时跟踪它们的原始位置 - JavaScript
【发布时间】:2019-01-04 17:25:28
【问题描述】:

我目前正在为一个项目编写 JavaScript 代码,在该项目中我需要基于原始数组创建修改后的数组。在随机选择需要修改的原始数组的元素时,我遇到了问题。出于项目的目的,我需要跟踪每个元素的原始位置,但我也不能两次选择相同的元素。

到目前为止,我一直在随机选择一个项目:

var originalArray = [1, 2, 4, 3, 5, 2, 5];

var modifiedArray = [];

var copyOriginalArray = originalArray;

var score = Math.floor(Math.random() * copyOriginalArray.length);

var targetScore = copyOriginalArray[score];

targetProfile.push(targetScore);

copyOriginalArray.splice(score, 1);

但问题是,虽然它会随机选择一个项目并确保不会再次选择它,但它不允许我跟踪项目的原始位置。此外,由于某些项目可能相同,因此我不能简单地将它们追溯到原始数组。

你建议做什么?

非常感谢!

【问题讨论】:

  • 不是您的主要问题的答案,但要小心var copyOriginalArray = originalArray; 这不是数组的副本 - 它是引用同一个数组的两个变量!
  • 定义数组时出现语法错误,缺少=
  • 为什么不采用索引数组,将其随机化并用于选取值。
  • 此外,如果您的代码实际运行,它确实可以帮助我们了解您想要做什么。你有一些没有定义但看起来很重要的变量,比如copyUser,让事情变得混乱
  • 抱歉这些错误,我写了新代码,还从我的项目中复制了一些代码,忘记修改变量的名称。我希望现在更清楚了!运行它的问题是代码实际上要复杂得多,我只是试图简化它以解决这个特定问题。感谢您的帮助。

标签: javascript arrays random


【解决方案1】:

我建议您创建一个名为 positions 的新数组,其中包含索引:

positions = [1,2,3,4,5,6,7]

当你修改原始数组中的位置时,你也会在位置数组上修改它,最后你会得到例如:

positions = [4,2,3,1,6,7,5]

你会知道数组中的第一个元素是原始数组中的第四个元素。

【讨论】:

    【解决方案2】:

    您可以创建一个单独的数字数组 0..(array.length - 1),将其随机排列,然后使用它一个接一个地挑选项目:

    function shuffle(arr) {
        for (var i = arr.length - 1; i >= 1; i -= 1) {
            var j = Math.floor(Math.random() * (i + 1));
            var temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    
    var originalArray = [1, 2, 4, 3, 5, 2, 5];
    
    var indices = originalArray.map(function (x, i) { return i });
    
    console.log('Indices:', indices);
    
    shuffle(indices);
    
    console.log('Shuffled indices:', indices);
    
    console.log('Original array in random order:');
    
    for (var i = 0; i < indices.length; i += 1) {
        console.log(originalArray[indices[i]]);
    }

    另一种选择是简单地复制原始数组并随机播放。这种方法的缺点是您不知道副本中的哪个项目来自原始数组中的哪个位置(听起来您需要这样做)。

    function shuffle(arr) {
        for (var i = arr.length - 1; i >= 1; i -= 1) {
            var j = Math.floor(Math.random() * (i + 1));
            var temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    
    var originalArray = [1, 2, 4, 3, 5, 2, 5];
    
    var copiedArray = originalArray.slice();
    
    shuffle(copiedArray);
    
    console.log('Shuffled array:', copiedArray);
    console.log('Original array:', originalArray);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2014-07-23
      相关资源
      最近更新 更多