lodash:从对象数组中获取对象值

时间:2016-03-29 15:49:34

标签: javascript lodash

我有一个像下面这样的对象数组。数组中的每个对象都有一个instructors字段,该字段也是一个数组。如何通过lodash从此对象数组中获取所有电子邮件字段?

我需要使用双_.map函数吗?我可以在对象中运行foreach,然后在教师中运行另一个foreach,但我不认为这非常优雅。我无法从包含其他数组字段的对象数组中获取值。任何帮助将不胜感激。

[
{
    'title': 'New Class',
    'instructors': [
        {
            'email': 'someemail@gmail.com'
        },
        {
            'email': 'anotheremail@gmail.com'
        }    
    ]
},
{
    'title': 'New Class 2',
    'instructors': [
        {
            'email': 'someemail@gmail.com'
        },
        {
            'email': 'anotheremail@gmail.com'
        }    
    ]
}    

];

3 个答案:

答案 0 :(得分:4)

  

我是否需要使用双_.map函数?

这是一个解决方案。您认为您正在寻找flatMap



var classes = [{
  'title': 'New Class',
  'instructors': [{
    'email': 'someemail@gmail.com'
  }, {
    'email': 'anotheremail@gmail.com'
  }]
}, {
  'title': 'New Class 2',
  'instructors': [{
    'email': 'someemail@gmail.com'
  }, {
    'email': 'anotheremail@gmail.com'
  }]
}];

var emails = _.flatMap(classes, function(cls) {
  return _.map(cls.instructors, 'email');
});

document.querySelector('#out').innerHTML = JSON.stringify(emails, null, 4);

<script src="https://cdn.jsdelivr.net/lodash/4.6.1/lodash.min.js"></script>
<pre id="out"></pre>
&#13;
&#13;
&#13;

答案 1 :(得分:3)

所以你知道,香草方法也很短:

var out = arr.reduce(function (p, c) {
  return p.concat(c.instructors.map(function (instructor) {
    return instructor.email;
  }));
}, []);

答案 2 :(得分:0)

这应该有效:

var allEmails = [];

_.each(myArray, function(obj) {
  _.each(obj.instructors, function(instructor) {
    allEmails.push(instructor.email);
  }, this);
}, this);

return allEmails;

https://jsfiddle.net/k4uahqkk/1/

使用_.reduce_.map的更优雅的解决方案是:

_.reduce(myArray, function(result, value, key) {
    return result.concat(_.map(value.instructors, 'email'));
}, []);

https://jsfiddle.net/z1tg4tro/4/

编辑:_.pluck由于不推荐使用v4.x,请改用_.map