加入两个有序数组,随机混合项目,但保持原始顺序
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>
通过随机分散两个有序数组的项目来组成一个数组,而在新数组中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>