javascript - 使用下划线/lodash 电子邮件列表/集合随机播放和配对

标签 javascript arrays collections underscore.js lodash

我正在尝试打乱一个对象数组(姓名和电子邮件地址),将其变成给予者 -> 接收者配对数组。每次迭代都会从接收者的集合中删除给予者,因此集合中的每个成员都将获得一个独特的合作伙伴。

我使用了 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. 打乱数组。这是给予者的数组。
  2. 将其复制到接收器数组。
  3. 将接收器数组偏移 1。
  4. 使用 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/

相关文章:

javascript - Stack Overflow 标签 - 它们如何在鼠标悬停时显示信息?

javascript - 从本地文件夹导入 type=module 的脚本会导致 CORS 问题

delphi - 当以任意位长度定位时,从字节数组中读取变量

java - HashMap.containsKey(Object key) 找不到键

collections - 如何在 Kotlin 中无限重复序列?

javascript - 如何在渲染前在窗口调整大小事件中修改CSS?

javascript - React-native 如何在另一个 javascript 文件中使用状态值

javascript - 如何在 jQuery 中构建多维数组

ios - 在 Swift 中使用 "Map"创建两个数组的超集

java - 当元素过期时具有信令功能的过期映射