我有两个数组numbers
和picks
。 numbers
包含一系列数字,picks
目前为空。我想从numbers
中提取N个值,并将它们放在picks
中。我已经尝试了picks.push(numbers.splice(idx,1));
,其中idx
是介于0和numbers
中最高索引之间的随机数。这似乎 无法正常工作。任何建议将不胜感激。
答案 0 :(得分:3)
由于splice
返回一个数组,你只需要一个小的调整来检索这个新数组中的第一个(也是唯一的)项:
picks.push(numbers.splice(idx,1)[0]);
答案 1 :(得分:2)
好吧,正如许多其他人所说,Array.splice()返回一个数组(其中的元素被排序以从源数组中删除)。因此,你可以使用这样一个事实:你总是从中获取一个数字,如@JoeEnos答案,或采用更通用的形式:
[].push.apply(picks, number.splice(idx, 1));
// replace 1 with any other positive number, and it still works
但是,我认为您只是尝试重新实现Fisher-Yates shuffle算法。这里的关键是不使用splice
(因为重新排序大型数组可能会导致性能损失),而是将所选元素与源数组末尾的元素进行交换。以下是如何做到的:
var source = [1,2,3,4,5,6,7,8];
var shuffled = Array(source.length);
var i, j, len;
for (i = 0, len = shuffled.length; i < len; ++i) {
j = Math.random() * (i + 1)|0;
if (i !== j) {
shuffled[i] = shuffled[j];
}
shuffled[j] = source[i];
}
console.log(shuffled);
在这里eval.in demo可以玩。