我正在尝试打乱一个对象数组(姓名和电子邮件地址),将其变成给予者 -> 接收者配对数组。每次迭代都会从接收者的集合中删除给予者,因此集合中的每个成员都将获得一个独特的合作伙伴。
我使用了 lodash 并创建了一个 mixin。有时它可以工作,有时它会锁定浏览器。也许我的 while
部分出了问题。
_.mixin({
ldSanta: function (arr) {
var ret = [],
emailListCopy = _.assign(arr),
receiver = {};
_.times(_.size(emailListCopy), function (i) {
receiver = arr[i];
while (receiver === arr[i]) {
receiver = _.first(_.shuffle(emailListCopy));
}
var pair = {
'giver': arr[i],
'receiver': receiver
};
ret[i] = _.extend(pair);
emailListCopy = _.reject(emailListCopy, function (item) {
return item.name === receiver.name;
});
});
return ret;
}
});
例如。 http://jsfiddle.net/ezhsLw16/10
最佳答案
当 emailListCopy
中剩下的唯一人是 arr
中的最后一个人时,while 循环将永远持续下去。
您可以通过执行以下操作获得您想要的结果:
- 打乱数组。这是给予者的数组。
- 将其复制到接收器数组。
- 将接收器数组偏移 1。
- 使用
zip
合并 2 个数组。
通过这样做,您不必检查接收者是否与给予者相同。
_.mixin({
ldSanta: function (arr) {
if (arr.length < 2) {
throw "Invalid input, must have at least 2 people";
}
var givers = _.shuffle(arr);
var receivers = _.clone(givers);
receivers.push(receivers.shift());
var pairs = _.map(_.zip(givers, receivers), function(pair) {
return { giver: pair[0], receiver: pair[1] };
});
return pairs;
}
});
Live Demo (JSFiddle 现在有点慢)
关于javascript - 使用下划线/lodash 电子邮件列表/集合随机播放和配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25615760/