使用Lodash访问嵌套对象的属性

时间:2017-10-02 17:42:45

标签: json lodash

Lodash的documentation for map()包含一个这样的例子:

var users = [{'user': 'barney'}, {'user': 'fred'}];
_.map(users, 'user'); // => ['barney', 'fred']

我有类似的数据,但是嵌套了。他们是一个对象数组,但我有一个对象数组,每个对象都包含一个对象数组。扩展Lodash示例,我的数据是这样的:

var users = [
  {'mapping': [{'user': 'barney'}, {'user': 'fred'}]},
  {'mapping': [{'user': 'sherlock'}, {'user': 'watson'}]},
];

我想取回所有这四个名字。 (可以接受一组数组。)

我尝试了很多方法来做到这一点。你可以看到我的尝试:https://runkit.com/lsloan0000/lodash-map-nested

最终,我找到了这个解决方案:

// I didn't think it would take this much code
_.map(users, function (value, key, collection) {
    return _.map(value.mapping, 'user');
});

我认为Lodash有很多功能,我不需要使用回调函数。

有没有更简单的方法来实现这个目标?

我知道我可以跳过keycollection个参数。最后,我计划让此代码返回对象,其mapping包含两个特定名称。 (所有带有映射的对象为" fred"和#34; barney"在一起。)所以我在那里留下了那些论点,因为我认为我会为此目的而需要它们。

1 个答案:

答案 0 :(得分:0)

使用_.flatMap()将嵌套数组展平为单个数组,然后将其映射到user值:

var users = [
  {'mapping': [{'user': 'barney'}, {'user': 'fred'}]},
  {'mapping': [{'user': 'sherlock'}, {'user': 'watson'}]},
];

var result = _(users)
  .flatMap('mapping')
  .map('user')
  .value();
  
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

没有lodash链:

var users = [
  {'mapping': [{'user': 'barney'}, {'user': 'fred'}]},
  {'mapping': [{'user': 'sherlock'}, {'user': 'watson'}]},
];

var result = _.map(_.flatMap(users, 'mapping'), 'user');
  
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>