【问题标题】:lodash - How to convert a nested object into a unique array?lodash - 如何将嵌套对象转换为唯一数组?
【发布时间】:2014-11-25 13:01:48
【问题描述】:

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

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 来实现,主要用于教育目的:

for item in baseData
    atts = item.atts

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

【问题讨论】:

  • 我认为您上面的手动循环解决方案不正确。上面提供的预期输出表明每个阵列必须是唯一的,因为有两个100 lowfreqrange、两个connector 包和两个narrowband 放大器。

标签: arrays coffeescript underscore.js lodash


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你可以像这样使用 map 和 reduce 函数。

    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

    【讨论】:

      猜你喜欢
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 2015-03-26
      • 2019-01-31
      相关资源
      最近更新 更多