我目前正在使用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);
但是问题是,尽管它确实随机选择了一个项目并确保不会再次选择它,但它不允许我跟踪这些项目的原始位置。另外,由于某些项目可能相同,所以我不能简单地将它们追溯到原始数组。
您建议做什么?
非常感谢!
答案 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);