链+过滤器+值返回值不是函数?

时间:2016-01-06 03:22:39

标签: javascript underscore.js lodash

我关注了一系列对象。数组中的每个对象都包含用户信息。

var usersAll = [
  { id: '1', name: 'User 1', selected: true },
  { id: '2', name: 'User 2' },
  { id: '3', name: 'User 3' },
  { id: '4', name: 'User 4' }];

我想提取为selected设置为true的用户。

这是我使用

的代码
var selectedUsers = _(usersAll)
 .filter(function(u) {
   return u.selected
 })
 .map(function(u) {
   return u.name
 }
 .value()

但由于某种原因,它会返回:

  

TypeError:_(...)。filter(...)。value不是函数

我做错了什么?

2 个答案:

答案 0 :(得分:2)

_.filter_.pluck

一起使用
  1. 过滤数组以保留selected值为true
  2. 的用户
  3. 使用Pluck获取name
  4. 的值数组

    var usersAll = [{id: '1', name: 'User 1', selected: true},
        { id: '2', name: 'User 2'},
        { id: '3', name: 'User 3'},
        { id: '4', name: 'User 4', selected: true}
    ];
    
    var selectedUserNames = _.pluck(_.filter(usersAll, 'selected'), 'name');
    
    console.log(selectedUserNames);
    document.write(selectedUserNames);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>

    如果您不想使用任何库,可以使用Array#filterArray#map在JavaScript中完成此操作。

    var usersAll = [{id: '1', name: 'User 1', selected: true},
        { id: '2', name: 'User 2'},
        { id: '3', name: 'User 3'},
        { id: '4', name: 'User 4', selected: true}
    ];
    
    var selectedUserNames = usersAll.filter(function(e) {
        return e.selected;
    }).map(function(e) {
        return e.name;
    });
    
    console.log(selectedUserNames);
    document.write(selectedUserNames);

    使用 EcmaScript 6 / ES15 箭头功能,可以在一行中完成

    usersAll.filter(e => e.selected).map(e => e.name);
    

答案 1 :(得分:0)

对于使用 4.0.1 及更高版本的用户,如果您使用 each() 进行链接,似乎可能存在问题。检查这个https://github.com/lodash/lodash/issues/1879

问题可能类似于 Uncaught TypeError: _(...).filter(...).each(...).value is not a function

解决方案是显式调用 chain 方法

_.chain(usersAll) // instead of _(usersAll)
 ... // other chaining
 .each(function(u) {
   ...
 }
 .value()