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

时间:2015-09-12 13:41:06

标签: javascript lodash

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

_.map(people, function(person) {

    var age = calculateAge(person.birthDate);

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

});

我尝试过全面搜索,包括文档,但我还没有找到办法做到这一点。

3 个答案:

答案 0 :(得分: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;
}, []);

此外,如果你是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;
}, []);

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

答案 1 :(得分:0)

这可能对您有用:

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岁的人的对象。

答案 2 :(得分:0)

试试这个:

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

见工作fiddle