映射出JSON结构

时间:2015-05-14 23:00:16

标签: javascript json node.js lodash

我正在解析一条类似于:

的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。

3 个答案:

答案 0 :(得分:2)

您可以使用_.pluck获取数组中每个对象的属性值:

_.pluck(obj.staff.concat(obj.students), 'name')

答案 1 :(得分:1)

你的直觉是正确的;你不需要一个可变数组来用lodash做这个。

_(obj).map().flatten().pluck('name').value();

此版本适用于o中的任意数量的数组值。

JSBin

答案 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"]
}