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)