对象数组按特定键将它们分组
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
为每个函数试试这个:
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);
您可以跟踪最后一个 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
对象。
我有以下数组
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
为每个函数试试这个:
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);
您可以跟踪最后一个 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
对象。