lodash - 如何将嵌套对象转换为唯一数组?

时间:2014-09-30 19:32:33

标签: arrays coffeescript underscore.js lodash

我在atts数组中有一个嵌套的“items”对象。

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

2 个答案:

答案 0 :(得分: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()

在这里查看它(在vanilla JS中):http://jsbin.com/siniku/2/edit

答案 1 :(得分: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;
  }, {});