2015-05-14 113 views
3

我解析它看起來像一個JSON消息:映射出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。

回答

2

您可以使用_.pluck獲得陣列中的每個對象的屬性值:

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

編輯錯過了你有lodash可用,將離開這個香草JS版本無論如何。

你可以使用地圖更簡潔:

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; 
}, {}); 

Thi s返回以下內容:

{ 
    "name":["John","Sally","Bob","Lisa"], 
    "department": ["Math","Science","Law","IT"] 
} 
+0

這將意味着我不得不循環每個屬性的陣列雖然。我應該在這個問題上更加明確。 – ioseph

+0

我的意思是最低節點的每個屬性,即名稱,部門等。 – ioseph

+0

好吧@ioseph,多一個嘗試在那裏爲你 –

1

你的直覺是對的;你不需要一個可變數組來用lodash做到這一點。

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

此版本適用於o中的任意數量的數組值。

JSBin

+0

這是我會採取的相同的方法。除了我會使用'values()'來代替'map()'。它發生的更清楚一點,實際上比'map()'做內部工作少。 –