Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 映射JSON结构_Javascript_Json_Node.js_Lodash - Fatal编程技术网

Javascript 映射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'} ] }

我正在解析一条JSON消息,它看起来像:

{ 
    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')