Javascript 映射JSON结构
我正在解析一条JSON消息,它看起来像:Javascript 映射JSON结构,javascript,json,node.js,lodash,Javascript,Json,Node.js,Lodash,我正在解析一条JSON消息,它看起来像: { staff : [ {name : 'John', department : 'Math'}, {name : 'Sally', department : 'Science'}, ], students : [ {name : 'Bob', department : 'Law'}, {name : 'Lisa', department : 'IT'} ] }
{
staff : [
{name : 'John', department : 'Math'},
{name : 'Sally', department : 'Science'},
],
students : [
{name : 'Bob', department : 'Law'},
{name : 'Lisa', department : 'IT'}
]
}
我想从中提取每个独立值的数组。
i、 e
目前我正在做一些类似的事情
var names = [];
msg.staff.forEach(function(e) { names.push(e.name) })
msg.students.forEach(function(e) { names.push(e.name)})
这感觉过于冗长,只是想知道是否有更干净的方法来实现这一点(针对每个属性)。我已经在这个项目中加入了lodash。编辑错过了你有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"]
}
你的直觉是对的;使用lodash执行此操作不需要可变数组
_(obj).map().flatten().pluck('name').value();
此版本适用于o
中任意数量的数组值
您可以使用
\uuu0.pull
获取数组中每个对象的属性值:
_.pluck(obj.staff.concat(obj.students), 'name')
这意味着我必须为每个属性循环数组。我应该在问题中说得更清楚。我指的是最低节点的每个属性,即名称、部门等。这是我将采取的相同方法。除了我会用
values()
代替map()
。它比map()。
_.pluck(obj.staff.concat(obj.students), 'name')