使用相似术语合并对象

时间:2016-07-18 22:01:16

标签: javascript arrays node.js functional-programming javascript-objects

我目前正在尝试将各种特征的数据集合在一起。我是演习的最后一部分,那就是:

转过来:

[
  {
    "AU": {
      "iOS": 1
    }
  },
  {
    "US": {
      "iOS": 2
    }
  },
  {
    "CA": {
      "iOS": 1
    }
  },
  {
    "US": {
      "Android": 1
    }
  },
  {
    "DO": {
      "Android": 1
    }
  }
]

进入这个:

[
  {
    "AU": {
      "iOS": 1
    }
  },
  {
    "US": {
      "iOS": 2,
      "Android": 1
    }
  },
  {
    "CA": {
      "iOS": 1
    }
  },
  {
    "DO": {
      "Android": 1
    }
  }
]

换句话说,groupBy CountryCode并保留各自的iOS或Android标签。另外,请记住,不允许计算密钥。 Computed Keys非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

使用一点omap助手和Object.assign这是一项非常简单的任务

let input = [
  { "AU": { "iOS": 1 } },
  { "US": { "iOS": 2 } },
  { "CA": { "iOS": 1 } },
  { "US": { "Android": 1 } },
  { "DO": { "Android": 1 } }
]

let omap = (o,f)=>
  Object.keys(o).reduce((acc, k)=>
    Object.assign(acc, { [k]: f(o[k], k, o) }), {})

var output = input.reduce((acc, x) =>
  Object.assign(acc, omap(x, (v, k)=>
    acc[k] === undefined
      ? v
      : Object.assign({}, acc[k], v))), {})

console.log(output)

<强>解释

omap允许您像数组一样映射对象

let omap = (o,f)=>
  Object.keys(o).reduce((acc, k)=>
    Object.assign(acc, { [k]: f(o[k], k, o) }), {})

omap({a:1, b:2, c:3}, x=> x*x)
//=> {a:1, b:3, c:9}

使用omap,我们可以迭代每个输入并将键映射到最终输出对象

// reduce the list of inputs by ...
var output = input.reduce((acc, x) =>
  // assigning to the final output, the omap'd input
  Object.assign(acc, omap(x, (v, k)=>
    // if the final output doesn't have a matching key
    acc[k] === undefined
      // return the input's value
      ? v
      // otherwise return the existing final output merged with the input value
      : Object.assign({}, acc[k], v))), {})

console.log(output)

答案 1 :(得分:0)

我不确定你的意思是什么,不允许使用计算键,但我在https://jsfiddle.net/ezrajr/z35q9s3h/

设置了一个jsfiddle

这会将您的数据数组转换为数据对象,这意味着您不必再了解索引。您可以使用字符串访问符号直接访问数据:

app

或点符号:

data['US']['iOS'];

任何一个都可用于访问数据,但通常在您知道密钥时使用点表示法,并且在动态设置密钥时使用字符串表示法。

答案 2 :(得分:0)

完全是香草的JavaScript -

input.forEach(function(item){
    Object.keys(item).forEach(function(country){
        var systems = item[country]
        if (!obj[country]) obj[country] = {}
        Object.keys(systems).forEach(function(system){
            if (!obj[country][system]) obj[country][system] = item[country][system]
            else obj[country][system] += item[country][system]
        })
    })
})

如果你可以使用库(如Underscore或JQuery),你也可以收紧语法