嵌套在 JavaScript KNOCKOUT 中的循环



>我有两个可观察的数组:

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

位置视图模型

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));
    };

用户视图模型

    // 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}
}

您也可以按如下方式使用 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){        
    });
});

查看文档

我希望它有所帮助。

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

假设您在ContentRole之间加入:

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;
        }
    );

最新更新