Javascript 构建所有选定元素和未选定元素的集合

Javascript 构建所有选定元素和未选定元素的集合,javascript,jquery,underscore.js,Javascript,Jquery,Underscore.js,我想收集所有被选中和未选中的元素 dom元素由多个多选组成 他们每个人都有相同的用户。 我的目标是创建所有用户的集合,并为选中的用户添加具有特定值的属性 这是我的代码js代码(1),这是链接 我的代码可以工作,但我想擦干代码,因为可能不需要仅在第一个选择上进行剪切以获取所有用户。 有没有关于如何干燥以下js代码的提示? 更多信息请阅读js代码上的注释;谢谢 附言: 1) 我使用的是jQuery和下划线 2) 我从服务器获得html代码,与jsfiddle.net/vxRtb/9中的代码相同 这

我想收集所有被选中和未选中的元素

dom元素由多个
多选
组成
他们每个人都有相同的用户。
我的目标是创建所有用户的集合,并为选中的用户添加具有特定值的属性

这是我的代码js代码(1),这是链接

我的代码可以工作,但我想擦干代码,因为可能不需要仅在第一个选择上进行剪切以获取所有用户。
有没有关于如何干燥以下js代码的提示?
更多信息请阅读js代码上的注释;谢谢

附言:
1) 我使用的是
jQuery
下划线

2) 我从服务器获得html代码,与jsfiddle.net/vxRtb/9中的代码相同



这是一个相当老的问题,你可能已经离开了它,然而,我尝试了一下,这里是我想到的

分析 这些循环非常相似,关键的区别在于一个循环构建团队成员,另一个循环构建团队成员。我认为DRY选项是只使用一个循环并测试一个成员是否有团队。由于用户id是非唯一的,因此会有重复,因此需要应用一些逻辑

伪码
  • 基于
    标记创建用户对象集合。
  • 使用getMyTeam生成团队名称
  • 按ID对用户对象进行分组
  • 筛选用户对象,仅使用具有团队名称的用户对象
  • 筛选没有团队名称的用户对象,以仅显示uniq记录
  • 代码 我不确定这是否更好。性能方面,由于所有嵌套,这应该是相当差的。然而,我想优点是代码变得更加模块化,如果需要,您可以轻松地更改规则

    $(function () {
        var $selectElements = $('form .controls select');
        var userCollection = []; 
    
        // Subroutine_1
        // TODO Subroutine_1 and Subroutine_2 seems too close; any idea how to dry this code?
        $.each($($selectElements[0]), function (i, teamElement) {
            var $users = $(teamElement).find('option')
    
            $.each($users, function (i, user) {
                userCollection.push({
                    id: $(user).val(),
                    name: $(user).text(),
                });            
            });
        });
    
        // Subroutine_2
        $.each($selectElements, function (i, teamElement) {
            var $teamElement = $(teamElement);
            //var teamId = $teamElement.attr('id');
            var teamName = $teamElement
                .parent().parent().closest('.controls')
                .find('input').val();
            var $users = $teamElement.find('option:selected');
    
            $.each($users, function (i, user) {
                _.where(userCollection, {id: $(user).val()})[0].team = teamName;           
            });
        });
    
        console.log(userCollection);
    });
    ​
    
    $(function () {
    
        // Helper to find a team based on an options element
        function getMyTeam() {
            if (this.is(':selected')) {
                var select = this.parent();
                var teamId = select.attr('id').replace(/_participations$/, '_name');
                return $('#' + teamId).val();
            }
            return undefined;
        };
    
        // Helper to return an object's id
        function getId(obj) {
            return obj.id;
        };
    
        // Helper to filter the team members by team name.
        function filterMembersByTeam(members) {
            var result = _.filter(members, function(record) {
                return !_.isUndefined(record['team']);
            });
            if (result.length === 0) { 
                result = _.uniq(members, true, function(member) {
                    return JSON.stringify(member);
                })
            };
            return result;
        };
    
        // 1. Select the users
        var options = $('form .controls select option');
    
        // 2. Build up the user data
        var userCollection = _.map(options, 
                              function(option) {
                                return { 
                                        id: $(option).val(),
                                        name: $(option).text(),
                                        team: getMyTeam.apply($(option)) 
                                    };
                              }); 
    
        // 3. Clean & filter the user data
        userCollection = 
            _.flatten( 
                _.map( _.groupBy(userCollection, getId), filterMembersByTeam) 
            );
    
        console.log(userCollection);
    });