簡體   English   中英

如何減少和映射對象數組?

[英]How to reduce and map an object array?

如何減少此對象數組並將其映射到新數組?

我的數據:

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
  }];

如果一個條目具有相同的statetype我需要將它組合成一個條目並對它們的總體求和。

最后,我需要將它映射到這種格式的數組。

 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一個鍵,例如'NY_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]])
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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM