我在我的项目中使用lodash.js,从集合中获取过滤列表" applicationuser"。我在我的js文件中使用_.filter
方法,最初我得到一个记录数组到vm.user=[user1,user2,user3,user4]
然后我想从applicationuser获取筛选列表,其中包含属于vm.userid的userid。通常当我使用_.filter
方法时,我只需要比较一个这样的值
vm.userlist= _.filter(applicationuser,function(user){
return user.userid= vm.user.userid
});
但是在这种情况下,我必须与上面提到的用户ID数组进行比较,我在上面的代码中写了for循环
vm.userlist= _.filter(applicationuser,function(user){
for( var i=0; i<vm.user.length; i++)
{
return user.userid= vm.user[i].userid
}
});
但是我得到了未经过滤的列表(表示来自applicationuser的所有记录)。
答案 0 :(得分:1)
这是你用lodash方式实现同样的方式。
vm.userlist= _.filter(applicationuser,function(user){
return _. some(vm.user, function(vuser){
return vuser.id == user.userid;
});
});
some函数检查数组中是否存在与谓词匹配的元素。一旦谓词返回truthy,迭代就会停止。
答案 1 :(得分:0)
你正在做=而不是==(赋值而不是比较)。
vm.userlist = _.filter(applicationuser,function(user){
return user.userid == vm.user.userid
});
答案 2 :(得分:0)
我不能代表lodash,但你提出的算法运行时O(n^2)
,这是不好的。
如果在哈希集中存储O(n)
值(所有JavaScript userid
实例都是哈希集)并使用Object
- 运行时{{1},则可以获得O(1)
运行时运算符:
in
你真的不需要lodash - 你可以使用var allUserIds = {};
for( var i = 0; i < applicationuser.length; i++ ) {
allUserIds[ applicationuser[i].userid ] = i; // storing the value `i` is arbitrary, you could also just store `null` or `true` some other value.
}
vm.userlist = _.filter( applicationuser, u => u.userid in allUserIds );
使用vanilla JavaScript(ECMAScript 5或更高版本):
Array.prototype.filter
在查看lodash文档之后,lodash将此功能内置为vm.userlist = applicationuser.filter( u => u.userid in allUserIds );
函数,您可以在一行中使用该函数,而无需手动创建自己的hashmap对象:
uniq
答案 3 :(得分:0)
lodash过滤器返回true / false。您可以按如下方式重写代码:
vm.userlist= _.filter(applicationuser,function(user){
return _.filter(vm.user, function(u) {
return u.userid == user.userid;
}).length>0;
});