Javascript 如何减少和映射对象数组?

Javascript 如何减少和映射对象数组?,javascript,arrays,Javascript,Arrays,如何减少此对象数组并将其映射到新数组 我的数据: var objArray = [{ state: 'NY', type: 'A', population: 100 }, { state: 'NY', type: 'A', population: 300 }, { state: 'NY', type: 'B', population: 200 }, { state: 'CA',

如何减少此对象数组并将其映射到新数组

我的数据:

var objArray = 
  [{
    state: 'NY',
    type: 'A',
    population: 100
  },
  {
    state: 'NY',
    type: 'A',
    population: 300
  },
  {
    state: 'NY',
    type: 'B',
    population: 200
  },
  {
    state: 'CA',
    type: 'A',
    population: 400
  },
  {
    state: 'CA',
    type: 'A',
    population: 400
  }];
如果一个条目具有相同的
状态
类型
,我需要将其合并为一个条目,并对其总体进行求和

最后,我需要将它映射到这种格式的数组

 var outputArray = [ ['A', 'NY', 400 ], ['B', 'NY', 200], ['A', 'CA', 800] ]

嗯,首先你要减少它。这可以这样做

objArray.reduce((prev, obj) => {
    if(1 + (indx = prev.findIndex(oldObj => oldObj.type === obj.type && oldObj.state === obj.state))) {
        prev[indx].population += obj.population;
    } else {
        prev.push({...obj})
    }
    return prev;
}, [])
这将获取正在收集的数组,并以某种方式修改它,然后在reduce回调中返回它。如果可以找到状态和类型正确的值,它将修改现有值的填充;或者,它会将一个新对象附加到数组的末尾

现在你需要绘制地图

.map(obj => [ obj.type, obj.state, obj.population ])

我建议使用
lodash
包(它在Javascript应用程序中非常常见)。它为操作数组添加了很多强大的函数。解释如何对组上的值求和。您需要稍微修改此答案,以考虑两个参数,您可以通过将
groupBy
命令更改为:

_.groupBy(objArray, function(val){
    return val.state + "#" + val.type
})

您可以尝试以下方法:

var arr = Object.keys(objArray).map(function (key) { return Object.keys(objArray[key]).map(function (key) { return [[objArray[0].state, objArray[0].type, objArray[0].population],[objArray[1].state, objArray[1].type, objArray[1].population]]}); })[0][0];

如果您知道state和type永远不会有特定的字符,例如“\u”,那么您可以使用
state
type
制作一个键,例如“NY\u a”-有点像DB中的复合键。然后,您只需使用这些关键点创建一个对象,添加总体,然后将它们分离到一个数组中:

Object.entries(
    objArray.reduce((acc,curr) => (
    acc[curr.type + '_' + curr.state] = curr.population + (acc[curr.type + '_' + curr.state] || 0)
    , acc), {}))
.map(item => [...item[0].split('_'), item[1]])

使用,你需要展示你已经尝试过的东西。Stackoverflow不是免费的代码编写或教程服务。这里的目标是帮助您修复代码注意,此代码将原始数组变异为它变异的
prev
,但每次迭代都不同,并且是有意变异的。不过我不认为
objArray
是--对吗?
console.log(objArray)
-你会看到它在项目0和3中改变了填充量你推
obj
-对象是通过引用传递的-所以,当你更新
prev[0]。填充时,它与
objArray[0]
是同一个对象,所以
objArray[0].population
的属性与
prev[0]相同。population
@jm22当您在JS对象文本中放置一个没有值的键时,它是
obj:obj
的缩写,即推送自身。您必须使用spread op来推送其内容,而不是推送其本身
const _ = require('lodash')

const input = [
  { state: 'NY', type: 'A', population: 100 },
  { state: 'NY', type: 'A', population: 300 },
  { state: 'NY', type: 'B', population: 200 },
  { state: 'CA', type: 'A', population: 400 },
  { state: 'CA', type: 'A', population: 400 }
]

const expected = [
  ['A', 'NY', 400],
  ['B', 'NY', 200],
  ['A', 'CA', 800]
]

const output = _(input)
  .groupBy(({ state, type }) => [state, type].join(':'))
  .mapValues((states) => states.reduce((total, { population }) => total + population, 0))
  .map((population, stateType) => {
    const [state, type] = stateType.split(':')
    return [type, state, population]
  })
  .value()

console.log(expected)
console.log(output)