我正在解析一条类似于:
的JSON消息{
staff : [
{name : 'John', department : 'Math'},
{name : 'Sally', department : 'Science'},
],
students : [
{name : 'Bob', department : 'Law'},
{name : 'Lisa', department : 'IT'}
]
}
我想从中抽出每个单独值的数组。 即。
names -> ['John', 'Sally', 'Bob', 'Lisa']
目前我正在做类似
的事情var names = [];
msg.staff.forEach(function(e) { names.push(e.name) })
msg.students.forEach(function(e) { names.push(e.name)})
这感觉过于冗长,只是想知道是否有更清晰的方法来解决这个问题(针对每个属性)。我已经在这个项目中加入了lodash。
答案 0 :(得分:2)
您可以使用_.pluck
获取数组中每个对象的属性值:
_.pluck(obj.staff.concat(obj.students), 'name')
答案 1 :(得分:1)
你的直觉是正确的;你不需要一个可变数组来用lodash做这个。
_(obj).map().flatten().pluck('name').value();
此版本适用于o
中的任意数量的数组值。
答案 2 :(得分:0)
编辑错过了你有lodash可用,无论如何都会留下这个香草JS版本。
你可以使用map更简洁:
var directory = {
staff : [
{name : 'John', department : 'Math'},
{name : 'Sally', department : 'Science'},
],
students : [
{name : 'Bob', department : 'Law'},
{name : 'Lisa', department : 'IT'}
]
};
var names = directory.staff.concat(directory.students).map(function(person) {
return person.name;
});
如果您事先不知道各个键名,可以这样做:
Object.keys(directory).map(function(key) {
return directory[key]
}).reduce(function(p,c){
return p.concat(c)
}).map(function(person) {
return person.name;
});
我没有注意到获取存储在每个键下的所有值的数组的要求,但是应该这样做:
Object.keys(directory).map(function(key) {
return directory[key];
}).reduce(function(p,c) {
return p.concat(c);
}).reduce(function(p, c) {
Object.keys(c).forEach(function(oKey) {
if(p[oKey]) p[oKey].push(c[oKey]);
else p[oKey] = [c[oKey]];
});
return p;
}, {});
返回以下内容:
{
"name":["John","Sally","Bob","Lisa"],
"department": ["Math","Science","Law","IT"]
}