Chain + filter + value 返回值不就是一个函数吗?

Chain + filter + value returning value is not a function?

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

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()

但出于某种原因 returns 这个:

TypeError: _(...).filter(...).value is not a function

我做错了什么?

使用_.filter with _.pluck

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

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>


如果您不想使用任何库,可以在 JavaScript 中使用 Array#filter and Array#map

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

对于使用 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()