使用lodash从对象属性和值的集合创建两个数组

时间:2015-04-27 21:49:47

标签: javascript arrays javascript-objects lodash

我有一个包含对象的数组,如下所示:

[{
 "first" : 1
},
{
 "second" : 2
},
{
 "third" : 3
}]

我想将其转换为两个数组,索引根据这些值进行匹配,例如:

["first","second","third"]
[1,2,3]

我可以遍历这个并获取对象键和值,但我觉得在lodash中必须有一个光滑的方式来做这个,我不知道。有什么建议?谢谢!

3 个答案:

答案 0 :(得分:3)

您似乎只需映射该对象并致电keys()values()

您将获得第一个数组:

var items = [{a: "1"},{b: "blah",c: "what"},{d: "3"}]
keys = _(items).map(_.keys).flatten().value()

返回["a","b","c","d"]

第二个数组如:

values = _(items).map(_.values).flatten().value()

返回["1","blah","what","3"]

答案 1 :(得分:1)

对于非lodash解决方案:

var arr = [{"first" : 1},{"second" : 2},{"third" : 3}];
var keys = arr.map(function(el){return Object.keys(el)[0];});
var vals = arr.map(function(el){return el[Object.keys(el)[0]];});

对于相反的问题(将多个数组放入一个对象数组中),请参阅Merge two arrays into an array of objects with property values

答案 2 :(得分:0)

假设您的对象形状始终为{"label": value},那么您可以使用此vanilla JavaScript:

var data = [{"first" : 1},{"second" : 2},{"third" : 3}];
var labels = data.map(function(entry) {
    return Object.keys(entry)[0];
});
var values = data.map(function(entry) {
    return entry[Object.keys(entry)[0]];
});

根据您的评论,您的数据结构似乎不是最佳的。我会推荐一种替代结构:

var data = [
    {'label': 'first', 'value': 1},
    {'label': 'second', 'value': 2},
    {'label': 'third', 'value': 3}
]

在普通的JavaScript中,将标签和值挑选成单独的部分是非常简单的:

var labels = data.map(function(entry) {
    return entry.label;
});
var values = data.map(function(entry) {
    return entry.value;
});

或者如果你真的想使用lodash:

var labels = _.pluck(data, 'label');
var values = _.pluck(data, 'value');

希望您可以看到,无论您是否使用lodash,这个修改后的结构都会使JavaScript变得更加简单。