加入两个有序数组,随机混合项目,但保持原始顺序

Joining two ordered arrays, randomly mingle items, but keep original order

通过随机分散两个有序数组的项目来组成一个数组,而在新数组中A仍然在B之前,p在q之前,等等

怎么做?我可以使用 underscorejs 或 jquery.

[A,B,C,D]
[p,q,r,s]
==>
[p,q,A,r,B,C,D,s], or [A,B,p,C,q,r,s,D] or [A,p,q,B,r,C,s,D] or...

The following is not OK.
[B,p,A,...] or [p,A,r,...]

您的问题包含如何操作的答案。

取一个随机数组。
将第一个元素从它移动到结果数组。
重复直到所有元素都被移动。

可能的解决方案之一:

var a = ['A', 'B', 'C', 'D'], b = ['p', 'q', 'r', 's'], c = [];

while (a.length||b.length) {
  var r = Math.random()+.5|0;
  c.push([a, b][r].shift()||[a, b][+!r].shift());
}

console.log(JSON.stringify(c))

香草 js 最后。

var cap = ['A','B','C','D'];
var small = ['p','q','r','s'];

var arr = [];
var length = cap.length + small.length;
for(var i=0; i<length; i++) {
    var rand = Math.random()-0.5;
    var cond = rand > 0;
    var pick;
    if ( cap.length == 0 ) { pick = small; }
    else if ( small.length == 0 ) { pick = cap; }
    else { pick = cond ? cap : small; }
    arr.push( pick.shift() );
}

使用下划线,一般情况下(即任意数量的数组)可以使用sample

function mix(...arrays) {
  var res = [];
  while (_.some(arrays, a => a.length)) {
    res.push(_.sample(_.filter(arrays, a => a.length)).shift());
  }
  return res;
}

console.log(mix(['A', 'B', 'C', 'D'], ['p', 'q', 'r', 's'], [1, 2, 3, 4, 5]));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>