在javascript knockout中嵌套for循环

时间:2013-10-01 03:40:05

标签: javascript knockout.js knockout-2.0 linq.js

我有两个可观察的数组:

var viewModel = {
    PositionTypes: ko.observableArray([]),
    Users: ko.observableArray([])
}

POSITION ViewModel

var positionViewModel = function (data) {
        var _self = this;
        _self.PositionName = ko.observable(data.PositionName);
        _self.PositionRank = ko.observable(data.PositionRank);
        _self.ContentRole = ko.observable(data.ContentRole);
    }

    positionViewModel.AddPositions = function (data) {
        $.each(data, function (index, value) {
            positionViewModel.PushPosition(value);
        });
    };

    positionViewModel.PushPosition = function (postion) {
        viewModel.PositionTypes.push(new positionViewModel(position));
    };

USER ViewModel

    // the ViewModel for a single User
    var userViewModel = function (data) {
        var _self = this;
        _self.ID = ko.observable(data.ID);
        _self.Name = ko.observable(data.Name);
        _self.Email = ko.observable(data.Email);
        _self.ContentRole = ko.observable(data.ContentRole);
    };

    userViewModel.AddUsers = function (data) {
        $.each(data, function (index, value) {
            userViewModel.PushUser(value);
        });
    };


    userViewModel.PushUser = function (user) {
        viewModel.Users.push(new userViewModel(user));
    };

我如何使用linq.js以便我可以遍历每个位置,这样我就可以获得每个位置的所有用户?

foreach( each position in positions)
{
    foreach(each user in users)
    { list of users for the position}
}

2 个答案:

答案 0 :(得分:0)

您还可以使用ko.utils.arrayForEach,如下所示:

ko.utils.arrayForEach(viewModel.PositionTypes(), function(position){    
     var usersInPosition = ko.utils.arrayFilter(viewModel.Users(), function(user){
          return user.ContentRole() == position.ContentRole();
     });
     ko.utils.arrayForEach(usersInPosition, function(user){        

    });
});

<强> See doc

我希望它有所帮助。

答案 1 :(得分:0)

使用linq.js,您可以对要比较的列执行连接。

假设您加入ContentRole s:

var query = Enumerable.From(viewModel.PositionTypes())
    .GroupJoin(viewModel.Users(),
        "$.ContentRole()",  // position selector
        "$.ContentRole()",  // user selector
        "{ Position: $, Users: $$.ToArray() }")
    .ToArray();

所以我认为你想创建一个包含所有位置和用户名映射的对象。您可以使用Aggregate()函数创建此类对象,以将所有结果收集到单个对象中。

var userPositions = Enumerable.From(this.PositionTypes())
    .GroupJoin(this.Users(),
        "$.ContentRole()",  // position selector
        "$.ContentRole()",  // user selector
        "{ Position: $, Users: $$ }") // group all users per position
    .Aggregate(
        {}, // start with an empty object
        function (userPositions, x) {
            var positionName = x.Position.PositionName(),
                userNames = x.Users.Select("$.Name()").ToArray();

            // add the new property
            userPositions[positionName] = userNames;
            return userPositions;
        }
    );
相关问题