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