Lodash - 从地图方法中有条件地返回对象

mus*_*ubi 5 javascript lodash

我想迭代一个数组,运行一个计算,如果条件为结果为真,则返回一个新对象. _.filter(...)在这里不起作用,因为迭代器函数必须返回true或者false.

_.map(people, function(person) {

    var age = calculateAge(person.birthDate);

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

});
Run Code Online (Sandbox Code Playgroud)

我已经尝试过全面搜索,包括文档,但我还没有找到一种方法来做到这一点.

7za*_*rk7 10

听起来像是你想要reduce而不是map:

var newArray = _.reduce(people, function(results, person) {
  var age = calculateAge(person.birthDate);
  if (age > 50) {
     results.push({ person: person, age: age });
  }
  return results;
}, []);
Run Code Online (Sandbox Code Playgroud)

此外,如果你是ES6 +和/或使用Babel,这可能是列表推导的一个很好的用途:

let newArray = [for (person of people)
                if (calculateAge(person.birthDate) > 50)
                { person: person, age: calculateAge(person.birthDate) }
               ];
Run Code Online (Sandbox Code Playgroud)

更新:已从Babel 6中删除列表推导.ES2015版本如下所示:

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

(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator)