2014-09-30 126 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; 
    }, {}); 
相关问题