绘制JSON结构映射

3

我正在解析一个类似于以下格式的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个回答

2
您可以使用_.pluck来获取数组中每个对象的属性值:
_.pluck(obj.staff.concat(obj.students), 'name')

1
你的直觉是正确的;使用lodash不需要可变数组来完成这个任务。
_(obj).map().flatten().pluck('name').value();

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

JSBin


这是我会采取的相同方法,除了我会使用values()代替map()。它更清晰地展示了正在发生的事情,并且在内部实际上比map()做更少的工作。 - Adam Boduch

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

这意味着我需要为每个属性循环数组。我应该在问题中表述得更清楚。 - ioseph
我的意思是最底层节点的每个属性,例如名称、部门等。 - ioseph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接