2014-09-30 125 views
0

我在items的數組中嵌套了「atts」對象。lodash - 如何將嵌套的對象轉換爲唯一的數組?

baseData = [ 
    { 
     id: 123123 
     name: "Some Product" 
     atts: { 
      lowfreqrange: 100, 
      package: 'connector', 
      amplifier: 'narrowband' 
     } 
    }, 

    { 
     id: 5556652 
     name: "Some Second Product" 
     atts: { 
      lowfreqrange: 50, 
      package: 'drop-in', 
      amplifier: 'LNA' 
     } 
    }, 

    { 
     id: 5465456 
     name: "Some 2 Product" 
     atts: { 
      lowfreqrange: 100, 
      package: 'connector', 
      amplifier: 'narrowband' 
     } 
    } 
] 

,我想輸出是:

[ 
    lowfreqrange: [100, 50] 
    amplifier: ['LNA', 'narrowband'] 
    package: ['connector', 'drop-in'] 
] 

是否有一個快速的方式比手動循環lodash等來處理呢?我有這個,但想看看我能如何與lodash做到這一點,主要用於教育目的:

for item in baseData 
    atts = item.atts 

    for k, v of atts 
     result[k] = [] unless result[k] 
     result[k].push v 
+0

我覺得你上面的人工循環的解決方案是不正確。上面提供的預期輸出表明每個陣列必須是唯一的,因爲有兩個'100'低頻段,兩個'連接器'包和兩個'窄帶'放大器。 – ryeballar 2015-06-30 04:24:57

回答

0

您可以使用地圖和減少,像這樣的功能。

result = _(baseData).map((item) -> 
    item.atts 
).reduce((result, item) -> 
    result.lowfreqrange.push item.lowfreqrange 
    result.package.push item.package 
    result.amplifier.push item.amplifier 
    result 
, 
    lowfreqrange: [] 
    package: [] 
    amplifier: [] 
).valueOf() 

看到它在行動(香草JS)位置:http://jsbin.com/siniku/2/edit

0

我真的不知道很多關於CoffeeScript的,所以我會寫我的純JavaScript的解決方案。您可以通過採取每個atts關鍵值來解決此問題。

Demo

var result = _.reduce(['lowfreqrange', 'package', 'amplifier'], 
    function(object, key) { 
    object[key] = _(baseData).pluck(['atts', key]).uniq().value(); 
    return object; 
    }, {}); 

或者,如果你不能確定與atts鍵或數量,你根本就不想硬編碼他們,那麼你可以簡單地獲取他們所有,然後再申請上面的解決方案。

Demo

var result = _(baseData).pluck('atts').map(_.keys).flatten().uniq() 
    .reduce(function(object, key) { 
    object[key] = _(baseData).pluck(['atts', key]).uniq().value(); 
    return object; 
    }, {}); 
相關問題