从Map方法中有条件返回对象

Lodash - Conditionally Return Object from a Map Method

本文关键字:返回 对象 有条件 Map 方法      更新时间:2023-09-26

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

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

我试着到处搜索,包括文档,但我还没有找到一种方法来做这件事。

听起来你可能想要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)

这可以为您工作:

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岁以上的人的对象的新数组。

试试这个:

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

参见working fiddle