在跟踪元素的原始位置时仅随机选择一次数组中的元素-JavaScript

时间:2019-01-04 17:25:28

标签: javascript arrays random

我目前正在使用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);

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

您建议做什么?

非常感谢!

2 个答案:

答案 0 :(得分:0)

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

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

当您修改原始数组中的位置时,您还可以在positions数组中对其进行修改,最后,您将得到例如:

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

,您将知道数组中的第一个元素是原始数组中的第四个元素。

答案 1 :(得分:0)

您可以创建一个单独的数字数组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);