我可以在_.filter中使用for循环,如果没有在lodash.js中有任何解决方案吗?

时间:2017-07-20 04:01:15

标签: javascript underscore.js lodash

我在我的项目中使用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的所有记录)。

4 个答案:

答案 0 :(得分:1)

这是你用lodash方式实现同​​样的方式。

vm.userlist= _.filter(applicationuser,function(user){
    return _. some(vm.user, function(vuser){
         return vuser.id == user.userid;
    });
});
  

some函数检查数组中是否存在与谓词匹配的元素。一旦谓词返回truthy,迭代就会停止。

JSFiddle

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