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

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

本文关键字:函数 返回值 过滤器      更新时间:2023-09-26

我有下面的对象数组。数组中的每个对象都包含用户信息。

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

但出于某种原因,它返回了这个:

类型错误:_(…).filter(…).value不是函数

我做错了什么?

_.filter_.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>


如果您不想使用任何库,可以使用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);

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