在Lodash中将JavaScript数组堆叠为对象值

时间:2017-02-21 16:20:10

标签: javascript arrays lodash amcharts

我正在尝试在lodash中堆叠JavaScript对象数组值,其中每个数组值都要映射到生成的对象数组中的相应对象。例如:

olympicmedals = {
    '2008': [{'country': 'China', 'golds': 51}, {'country': 'USA', 'golds': 36}],
    '2012': [{'country': 'China', 'golds': 38}, {'country': 'USA', 'golds': 46}]
}

期望的结果:

olympicmedals = [
    {'country': 'China', 'golds2008': 51, 'golds2012': 38},
    {'country': 'USA', 'golds2008': 36, 'golds2012': 46}
]

Fwiw,这是用于amCharts中的图表,例如here(点击其中的“查看演示源”)。

我假设_.map()函数是要走的路,只是不太确定如何继续。谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用forEach()循环,但您还必须循环数组中的每个对象,以便为键添加年数。它还可以处理更多的对象属性而不仅仅是金牌。



var data = {
  '2008': [{
    'country': 'China',
    'golds': 51,
    silver: 10
  }, {
    'country': 'USA',
    'golds': 36
  }],
  '2012': [{
    'country': 'China',
    'golds': 38
  }, {
    'country': 'USA',
    'golds': 46,
    bronze: 10
  }]
}

var result = []
Object.keys(data).forEach(function(e) {
  var that = this;
  data[e].forEach(function(a) {
    if (!that[a.country]) {
      that[a.country] = {
        country: a.country
      }
      Object.keys(a).forEach(function(key) {
        if (key != 'country') that[a.country][e + key] = a[key]
      })
      result.push(that[a.country])
    } else {
      Object.keys(a).forEach(function(key) {
        if (key != 'country') that[a.country][e + key] = a[key]
      })
    }
  })
}, {})

console.log(JSON.stringify(result, 0, 4))




答案 1 :(得分:1)

有点晚了,但这是一个地图/缩小方式:

o = {
    '2008': [{'country': 'China', 'golds': 51}, {'country': 'USA', 'golds': 36}],
    '2012': [{'country': 'China', 'golds': 38}, {'country': 'USA', 'golds': 46}]
}

const countries = o[Object.keys(o)[0]].map(e => e.country)

const result = countries.map(country => {
  return Object.keys(o).reduce((p, year) => {
    p[`golds${year}`] = o[year].find(e => e.country === country).golds
    return p
  }, {country})
})
console.log(result)

对于这种转换任务,我发现首先获取列信息并将其存储在变量(countries)中是很方便的,基于哪一个filterfind以后的相关数据。可能还有一种方法可以在没有任何本地状态的情况下执行此操作,但我可以想象它不会非常易读。