Javascript Lodash-从映射方法有条件地返回对象

Javascript Lodash-从映射方法有条件地返回对象,javascript,lodash,Javascript,Lodash,我想迭代一个数组,运行一个计算,如果结果的条件为true,则返回一个新对象\过滤器(…)在这里不起作用,因为迭代器函数必须返回true或false _.map(people, function(person) { var age = calculateAge(person.birthDate); if (age > 50) { return {person: person, age: age}; } }); 我已经尝试搜索了所有地方,包括文档

我想迭代一个数组,运行一个计算,如果结果的条件为true,则返回一个新对象<代码>\过滤器(…)在这里不起作用,因为迭代器函数必须返回
true
false

_.map(people, function(person) {

    var age = calculateAge(person.birthDate);

    if (age > 50) {
        return {person: person, age: age};
    }

});

我已经尝试搜索了所有地方,包括文档,但我没有找到一种方法来做好这项工作。

这可能对您有用:

var sorted = _.filter(people, function(person) {

    var age = calculateAge(person.birthDate);

    if (age > 50) {
      return true;
    }
});

var newArray = _.map(sorted, function(person) {

   var age = calculateAge(person.birthDate);

   return {person: person, age: age};
});

这将首先过滤列表,然后返回一个新数组,其中包含年龄在50岁以上的人的对象。

听起来您可能希望
减少
,而不是
映射

var newArray = _.reduce(people, function(results, person) {
  var age = calculateAge(person.birthDate);
  if (age > 50) {
     results.push({ person: person, age: age });
  }
  return results;
}, []);
此外,如果您是ES6+和/或使用Babel,这可能是列表理解的一个很好的用途:

let newArray = [for (person of people)
                if (calculateAge(person.birthDate) > 50)
                { person: person, age: calculateAge(person.birthDate) }
               ];
更新:已从Babel 6中删除列表理解。ES2015的版本如下所示:

const newArray = people.reduce((results, person) => {
  const age = calculateAge(person.birthDate);
  return (age > 50) ? [...results, { person, age }] : results;
}, []);
()

试试这个:

people = _.pluck(
                _.filter(
                        _.map(people, function(person) {
                            return { person: person, age: calculateAge(person.birthDate) };
                        }), 
                        function(person) {
                            return person.age > 50;
                        }
                ), 
                "person"
        );

请参阅工作

在调用
映射
时未定义变量
年龄
。还有,如果你已经过滤掉了年轻人,为什么还要再检查一次年龄呢?而且,
返回年龄>50岁
更惯用。为了避免重新计算年龄,您可以将其粘贴在过滤器中的对象上,这也允许您使用
拾取
从地图返回。理想情况下,我希望进行数据库调用,而不是
calculateAge(…)
方法,因此我希望避免两次查询数据库。在两个示例中,变量
age
来自何处?您可以链接方法,而不是将它们嵌套在lodash:)