Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript敲除中的嵌套for循环_Javascript_Knockout.js_Knockout 2.0_Linq.js - Fatal编程技术网

javascript敲除中的嵌套for循环

javascript敲除中的嵌套for循环,javascript,knockout.js,knockout-2.0,linq.js,Javascript,Knockout.js,Knockout 2.0,Linq.js,我有两个可观测阵列: var viewModel = { PositionTypes: ko.observableArray([]), Users: ko.observableArray([]) } 位置视图模型 用户视图模型 如何使用linq.js循环浏览每个位置,从而获得每个位置的所有用户 foreach( each position in positions) { foreach(each user in users) { list of users fo

我有两个可观测阵列:

var viewModel = {
    PositionTypes: ko.observableArray([]),
    Users: ko.observableArray([])
}
位置视图模型

用户视图模型

如何使用linq.js循环浏览每个位置,从而获得每个位置的所有用户

foreach( each position in positions)
{
    foreach(each user in users)
    { list of users for the position}
}
您还可以使用以下选项:

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,您可以对要比较的列执行联接

假设您正在连接ContentRoles:

所以我认为您需要创建一个包含所有位置和用户名映射的对象。可以使用聚合函数创建这样的对象,将所有结果收集到单个对象中

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

用户和职位之间的联系是什么?谢谢,我会试试的。此结构是否会影响整体性能?不会,但如果客户端上的ID或Name属性没有更改,则可以用常规属性替换这些可观察对象。而不是在此处使用arrayForEach,我认为使用arrayMap更合适。如果我想使用linq,比如:linq.FromviewModel.PositionTypes。。。。我想使用linq.js并传入一个字符串,在我看来,我会在查询上绑定数据以显示infor?您当然可以这样做。虽然您没有向我们展示您的视图或您打算如何使用结果,但我只是给出了一个通用示例,说明您可以在查询中执行哪些操作。这个查询按位置对所有用户进行分组。我想使用linq.js并传入一个字符串,这样外部循环将是位置,然后为每个位置选择用户将每个用户与其位置分组抱歉,我不明白你在说什么。如果您想按照某个位置对所有用户进行分组,那么上面的查询(如我所示)应该可以满足您的需要。如果你很难描述你所说的话,那么举一个输入数据和预期输出数据的例子会有所帮助。因此,我有一个职位列表:老板、主管、工人,我有一个用户列表:萨达姆、马特、蒂姆、汤姆、约翰。我想用javascript编写一个类似linq的查询,如下所示:linq.FromviewModel.PositionTypes.ForEachusers in viewModel.Users.wherex=>x.ContentRole==viewModel.PositionTypes.ContentRole//返回信息,结果如下:Boss:John;主管:马特,蒂姆;工人:亚当,蒂姆
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){        

    });
});
var query = Enumerable.From(viewModel.PositionTypes())
    .GroupJoin(viewModel.Users(),
        "$.ContentRole()",  // position selector
        "$.ContentRole()",  // user selector
        "{ Position: $, Users: $$.ToArray() }")
    .ToArray();
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;
        }
    );