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

Create two arrays from a collection of object property and values with lodash

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

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

我想把它变成两个数组,根据这些值匹配索引,例如:

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

我可以遍历它并获取对象键和值,但我觉得在 lodash 中必须有一种巧妙的方法来做到这一点,我不知道。有什么建议么?谢谢!

看来您只需要映射对象并调用 keys() and values()

您将得到第一个数组:

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

returns ["a","b","c","d"]

第二个数组如:

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

returns ["1","blah","what","3"]

假设你的对象形状总是{"label": value},那么你可以使用这个香草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');

希望你能看到这个修改后的结构让 JavaScript 无论你是否使用 lodash 都变得更加简单。

对于非 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]];});

相反的问题(多个数组变成一个对象数组),见