2013-02-12 44 views
3
屬性

我有我從API接收下列對象:提取對象從對象的名單在Javascript

{ 
    '2012-12-12': [ 
     { 'id': 1234, 
     'type': 'A' }, 
     { 'id': 1235, 
     'type': 'A' }, 
     { 'id': 1236, 
     'type': 'B' }, 
    ], 
    '2012-12-13': [ 
     { 'id': 1237, 
     'type': 'A' }, 
     { 'id': 1238, 
     'type': 'C' }, 
     { 'id': 1239, 
     'type': 'B' }, 
    ] 
} 

然後,我希望有另一個變量命名Array類型,將持有每一個可能的types每個對象的type屬性的值。在這種情況下,這將是:

types = ['A', 'B', 'C'] 

我試圖把它的功能性的方式(我使用underscore.js)這樣做,但我無法找出這樣做的一種方式。現在我正在使用

types = []; 
_.each(response, function(arr1, key1) { 
    _.each(arr1, function(arr2, key2) { 
     types.push(arr2.type); 
    }); 
}); 
types = _.uniq(types); 

但這很醜陋。你能幫我弄清楚編寫這段代碼的更好方法嗎?

謝謝!

+0

您的代碼很清楚。我認爲這沒有問題。 – 2013-02-12 21:40:53

+0

您可以保留一個單獨的「typeMap」變量,其值將以一個簡單的對象('{}')開始。然後你可以用它來跟蹤你已經看過的類型。 – Pointy 2013-02-12 21:41:31

+0

@dystroy如果原始對象很大,類型數量很少,那麼就會做一些不必要的工作,但我同意它在小規模上可能並不是一件壞事。 – Pointy 2013-02-12 21:42:21

回答

5

這應該工作:

types = _.chain(input) // enable chaining 
    .values()   // object to array 
    .flatten()   // 2D array to 1D array 
    .pluck("type")  // pick one property from each element 
    .uniq()    // only the unique values 
    .value()    // get an unwrapped array 

小提琴:http://jsfiddle.net/NFSfs/

當然,如果你願意,你可以刪除所有空格到:

types = _.chain(input).values().flatten().pluck("type").uniq().value() 

或不鏈接:

types = _.uniq(_.pluck(_.flatten(_.values(input)),"type")); 

flatten seems to work on objects,即使the documentation clearly states it shouldn't。如果您希望針對實施進行編碼,您可以撥打電話values,但我不建議這樣做。實現可能會改變一天,讓你的代碼神祕破碎。

1

如果你只是想要更短的代碼,你可以將這些對象壓平成一個數組,然後映射該數組。

var types = _.unique(_.map(_.flatten(_.toArray(response)), function(arr) { 
    return arr.type; 
})); 

下面是另一個版本。主要是出於好奇的緣故。

var types = _.unique(_.pluck(_.reduce(response, _.bind(Function.apply, [].concat), []), "type")); 

這裏還有一個。

var types = _.unique(_.reduce(response, function(acc, arr) { 
    return acc.concat(_.pluck(arr,"type")); 
}, [])); 

而另一家。

var types = _.unique(_.pluck([].concat.apply([], _.toArray(response)), "type")) 
+0

我不認爲你可以「扁平」一個對象 – 2013-02-12 21:56:54

+0

@JanDvorak:這是一個演示:http://jsbin.com/ewopeh/1 – 2013-02-12 21:57:38

+0

文檔聲稱它不應該工作:http://underscorejs.org/ #flatten – 2013-02-12 22:06:31