javascript:从一个数组中提取项目并将其放入另一个数组

时间:2016-02-02 15:56:59

标签: javascript arrays

我有两个数组numberspicksnumbers包含一系列数字,picks目前为空。我想从numbers中提取N个值,并将它们放在picks中。我已经尝试了picks.push(numbers.splice(idx,1));,其中idx是介于0和numbers中最高索引之间的随机数。这似乎 无法正常工作。任何建议将不胜感激。

2 个答案:

答案 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可以玩。