簡體   English   中英

對象數組按特定鍵對它們進行分組

[英]array of objects group them by a specific key

我有以下數組

const arr = [{
  agrupacion: "Total país",
  valor: "81.8",
  year: 2015
}, {
  agrupacion: "Total país",
  valor: "86.4",
  year: 2016
}, {
  agrupacion: "Total país",
  valor: "67.3",
  year: 2017
}, {
  agrupacion: "Total país",
  valor: "70.8",
  year: 2018
}, {
  agrupacion: "Total país",
  valor: "67.6",
  year: 2019
}, {
  agrupacion: "Oriental",
  valor: "78.6",
  year: 2015
}, {
  agrupacion: "Oriental",
  valor: "83.1",
  year: 2016
}, {
  agrupacion: "Oriental",
  valor: "65.6",
  year: 2017
}, {
  agrupacion: "Oriental",
  valor: "68.1",
  year: 2018
}, {
  agrupacion: "Oriental",
  valor: "63.7",
  year: 2019
}, {
  agrupacion: "Occidental",
  valor: "177.3",
  year: 2015
}, {
  agrupacion: "Occidental",
  valor: "182.9",
  year: 2016
}, {
  agrupacion: "Occidental",
  valor: "114.3",
  year: 2017
}, {
  agrupacion: "Occidental",
  valor: "144.5",
  year: 2018
}, {
  agrupacion: "Occidental",
  valor: "169.9",
  year: 2019
}, {
  agrupacion: "Urbano",
  valor: "79.6",
  year: 2015
}, {
  agrupacion: "Urbano",
  valor: "92.5",
  year: 2016
}, {
  agrupacion: "Urbano",
  valor: "62.1",
  year: 2017
}, {
  agrupacion: "Urbano",
  valor: "82.2",
  year: 2018
}, {
  agrupacion: "Urbano",
  valor: "80.6",
  year: 2019
}, {
  agrupacion: "Rural",
  valor: "86.5",
  year: 2015
}, {
  agrupacion: "Rural",
  valor: "63.7",
  year: 2016
}, {
  agrupacion: "Rural",
  valor: "87.2",
  year: 2017
}, {
  agrupacion: "Rural",
  valor: "45.7",
  year: 2018
}, {
  agrupacion: "Rural",
  valor: "38.9",
  year: 2019
}];

我使用這種方法來實現我想要的:

const groups = new Map(arr.map(({agrupacion}) => [agrupacion, { agrupacion }]));
for (const {agrupacion, valor, year} of arr) {
    groups.get(agrupacion)["col" + year] = +valor;
}

const result = [...groups.values()];

輸出是(console.log(result)):

[{
  agrupacion: "Total país",
  col2015: 81.8,
  col2016: 86.4,
  col2017: 67.3,
  col2018: 70.8,
  col2019: 67.6
}, {
  agrupacion: "Oriental",
  col2015: 78.6,
  col2016: 83.1,
  col2017: 65.6,
  col2018: 68.1,
  col2019: 63.7
}, {
  agrupacion: "Occidental",
  col2015: 177.3,
  col2016: 182.9,
  col2017: 114.3,
  col2018: 144.5,
  col2019: 169.9
}, {
  agrupacion: "Urbano",
  col2015: 79.6,
  col2016: 92.5,
  col2017: 62.1,
  col2018: 82.2,
  col2019: 80.6
}, {
  agrupacion: "Rural",
  col2015: 86.5,
  col2016: 63.7,
  col2017: 87.2,
  col2018: 45.7,
  col2019: 38.9
}];

該輸出是我需要的格式,但是當我將具有相同“agrupacion”值的附加數據添加到我的 arr 數組時,問題就出現了,例如,我將它添加到我的 arr 數組的末尾

,{
  agrupacion: "Total país",
  valor: "151",
  year: 2015
}, {
  agrupacion: "Total país",
  valor: "184",
  year: 2016
}, {
  agrupacion: "Total país",
  valor: "165",
  year: 2017
}, {
  agrupacion: "Total país",
  valor: "147",
  year: 2018
}, {
  agrupacion: "Total país",
  valor: "190",
  year: 2019
}

這就是我需要的:

[{
  agrupacion: "Total país",
  col2015: 81.8,
  col2016: 86.4,
  col2017: 67.3,
  col2018: 70.8,
  col2019: 67.6
}, {
  agrupacion: "Oriental",
  col2015: 78.6,
  col2016: 83.1,
  col2017: 65.6,
  col2018: 68.1,
  col2019: 63.7
}, {
  agrupacion: "Occidental",
  col2015: 177.3,
  col2016: 182.9,
  col2017: 114.3,
  col2018: 144.5,
  col2019: 169.9
}, {
  agrupacion: "Urbano",
  col2015: 79.6,
  col2016: 92.5,
  col2017: 62.1,
  col2018: 82.2,
  col2019: 80.6
}, {
  agrupacion: "Rural",
  col2015: 86.5,
  col2016: 63.7,
  col2017: 87.2,
  col2018: 45.7,
  col2019: 38.9
},{
  agrupacion: "Total país",
  col2015: 151,
  col2016: 184,
  col2017: 165,
  col2018: 147,
  col2019: 190
}];

這就是我嘗試得到的結果:

[{
  agrupacion: "Total país",
  col2015: 151,
  col2016: 184,
  col2017: 165,
  col2018: 147,
  col2019: 190
}, {
  agrupacion: "Oriental",
  col2015: 78.6,
  col2016: 83.1,
  col2017: 65.6,
  col2018: 68.1,
  col2019: 63.7
}, {
  agrupacion: "Occidental",
  col2015: 177.3,
  col2016: 182.9,
  col2017: 114.3,
  col2018: 144.5,
  col2019: 169.9
}, {
  agrupacion: "Urbano",
  col2015: 79.6,
  col2016: 92.5,
  col2017: 62.1,
  col2018: 82.2,
  col2019: 80.6
}, {
  agrupacion: "Rural",
  col2015: 86.5,
  col2016: 63.7,
  col2017: 87.2,
  col2018: 45.7,
  col2019: 38.9
}]

顯然它會覆蓋第一個“Total país”中的所有值,而不是用我添加的新值重復那個 agrupacion

試試這個 forEach 函數:

 let arrayBuild = []
      let results = []
      let currentAgrupacion = ''
      let element = {}
      
      arr.forEach(elem => {
        if(currentAgrupacion !== elem.agrupacion) {
          if(currentAgrupacion !== '') {
            results.push(element)
          }
          currentAgrupacion = elem.agrupacion
          element = {
            agrupacion: elem.agrupacion
          }
      element["col"+elem.year] = parseFloat(elem.valor)
    }
    else {
      element["col"+elem.year] = parseFloat(elem.valor)
    }
  })
  results.push(element)

  console.log(results)

將數組縮減為一個對象,其中鍵對應於agrupacion ,值對應於對象數組。 這個數組的長度是根據一個特定的agrupacion一年出現的次數來決定的。

因此,以下數組:

[
  { agrupacion: "Total país", valor: "81.8", year: 2015 },
  { agrupacion: "Total país", valor: "86.4", year: 2016 },
  { agrupacion: "Total país", valor: "67.3", year: 2015 },
  { agrupacion: "Oriental", valor: "78.6", year: 2015 },
]

簡化為以下對象:

{
  "Total país": [
    { agrupacion: "Total país", col2015: 81.8, col2016: 86.4 },
    { agrupacion: "Total país", col2015: 67.3 },
  ],
  Oriental: [{ agrupacion: "Oriental", col2015: 78.6 }],
}

最后我們得到這個對象的值並將其展平為所需的結果。

 const arr = [ { agrupacion: "Total país", valor: "81.8", year: 2015 }, { agrupacion: "Total país", valor: "86.4", year: 2016 }, { agrupacion: "Total país", valor: "67.3", year: 2017 }, { agrupacion: "Total país", valor: "70.8", year: 2018 }, { agrupacion: "Total país", valor: "67.6", year: 2019 }, { agrupacion: "Oriental", valor: "78.6", year: 2015 }, { agrupacion: "Oriental", valor: "83.1", year: 2016 }, { agrupacion: "Oriental", valor: "65.6", year: 2017 }, { agrupacion: "Oriental", valor: "68.1", year: 2018 }, { agrupacion: "Oriental", valor: "63.7", year: 2019 }, { agrupacion: "Occidental", valor: "177.3", year: 2015 }, { agrupacion: "Occidental", valor: "182.9", year: 2016 }, { agrupacion: "Occidental", valor: "114.3", year: 2017 }, { agrupacion: "Occidental", valor: "144.5", year: 2018 }, { agrupacion: "Occidental", valor: "169.9", year: 2019 }, { agrupacion: "Urbano", valor: "79.6", year: 2015 }, { agrupacion: "Urbano", valor: "92.5", year: 2016 }, { agrupacion: "Urbano", valor: "62.1", year: 2017 }, { agrupacion: "Urbano", valor: "82.2", year: 2018 }, { agrupacion: "Urbano", valor: "80.6", year: 2019 }, { agrupacion: "Rural", valor: "86.5", year: 2015 }, { agrupacion: "Rural", valor: "63.7", year: 2016 }, { agrupacion: "Rural", valor: "87.2", year: 2017 }, { agrupacion: "Rural", valor: "45.7", year: 2018 }, { agrupacion: "Rural", valor: "38.9", year: 2019 }, { agrupacion: "Total país", valor: "151", year: 2015 }, { agrupacion: "Total país", valor: "184", year: 2016 }, { agrupacion: "Total país", valor: "165", year: 2017 }, { agrupacion: "Total país", valor: "147", year: 2018 }, { agrupacion: "Total país", valor: "190", year: 2019 }, ]; const result = Object.values( arr.reduce((r, o) => { if (!r[o.agrupacion]) { r[o.agrupacion] = [{ agrupacion: o.agrupacion }]; } const item = r[o.agrupacion].find((i) => !i["col" + o.year]); if (item) { item["col" + o.year] = parseFloat(o.valor); } else { r[o.agrupacion].push({ agrupacion: o.agrupacion, ["col" + o.year]: parseFloat(o.valor), }); } return r; }, {}) ).flat(); console.log(result);

您可以跟蹤 last yearData (您正在收集的數據組)。 如果給定的col<year>已經存在於該對象中,則創建一個新對象。

const result = [];
let yearData;
for (const {agrupacion, valor, year} of arr) {
  const colYear = `col${year}`;
  if (!yearData || colYear in yearData) {
    yearData = { agrupacion };
    result.push(yearData);
  }
  yearData[colYear] = +valor;
}

 const arr = [ { agrupacion: "Total país", valor: "81.8", year: 2015 }, { agrupacion: "Total país", valor: "86.4", year: 2016 }, { agrupacion: "Total país", valor: "67.3", year: 2017 }, { agrupacion: "Total país", valor: "70.8", year: 2018 }, { agrupacion: "Total país", valor: "67.6", year: 2019 }, { agrupacion: "Oriental", valor: "78.6", year: 2015 }, { agrupacion: "Oriental", valor: "83.1", year: 2016 }, { agrupacion: "Oriental", valor: "65.6", year: 2017 }, { agrupacion: "Oriental", valor: "68.1", year: 2018 }, { agrupacion: "Oriental", valor: "63.7", year: 2019 }, { agrupacion: "Occidental", valor: "177.3", year: 2015 }, { agrupacion: "Occidental", valor: "182.9", year: 2016 }, { agrupacion: "Occidental", valor: "114.3", year: 2017 }, { agrupacion: "Occidental", valor: "144.5", year: 2018 }, { agrupacion: "Occidental", valor: "169.9", year: 2019 }, { agrupacion: "Urbano", valor: "79.6", year: 2015 }, { agrupacion: "Urbano", valor: "92.5", year: 2016 }, { agrupacion: "Urbano", valor: "62.1", year: 2017 }, { agrupacion: "Urbano", valor: "82.2", year: 2018 }, { agrupacion: "Urbano", valor: "80.6", year: 2019 }, { agrupacion: "Rural", valor: "86.5", year: 2015 }, { agrupacion: "Rural", valor: "63.7", year: 2016 }, { agrupacion: "Rural", valor: "87.2", year: 2017 }, { agrupacion: "Rural", valor: "45.7", year: 2018 }, { agrupacion: "Rural", valor: "38.9", year: 2019 }, { agrupacion: "Total país", valor: "151", year: 2015 }, { agrupacion: "Total país", valor: "184", year: 2016 }, { agrupacion: "Total país", valor: "165", year: 2017 }, { agrupacion: "Total país", valor: "147", year: 2018 }, { agrupacion: "Total país", valor: "190", year: 2019 }, ]; const result = []; let yearData; for (const { agrupacion, valor, year } of arr) { const colYear = `col${year}`; if (!yearData || colYear in yearData) { yearData = { agrupacion }; result.push(yearData); } yearData[colYear] = +valor; } console.log(result);

答案確實假設arr具有一定的一致性。 即每組項目共享完全相同的年份范圍(您的數據中為 2015-2019 年),並且沒有缺失年份。

產生錯誤輸出的不一致輸入的示例是:

const arr = [
  { agrupacion: "a", valor: "1", year: 2015 },
  { agrupacion: "a", valor: "2", year: 2016 },
  { agrupacion: "a", valor: "3", year: 2017 },
  { agrupacion: "b", valor: "4", year: 2015 },
  // 2016 missing
  { agrupacion: "b", valor: "5", year: 2017 },
  // 2015 missing
  { agrupacion: "c", valor: "6", year: 2016 },
  { agrupacion: "c", valor: "7", year: 2017 },
];

結果是:

[
  { agrupacion: "a", col2015: 1, col2016: 2, col2017: 3 },
  { agrupacion: "b", col2015: 4, col2016: 6, col2017: 5 },
  { agrupacion: "c",                         col2017: 7 },
]

如果可能出現這些數據空白,您需要更改:

if (!yearData || colYear in yearData)

進入:

if (!yearData || agrupacion != yearData.agrupacion || colYear in yearData)

如果agrupacion不同或col<year>已經存在,則確保使用新的yearData對象。

暫無
暫無

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

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