重组对象数组然后对对象进行分组
Restructure array of objects then grouping objects
所以我找到了解决方案,但我仍在学习并且觉得我的解决方案太长了。它并没有使用全部的 ES6,而且可能会更好。我希望收到任何反馈 and/or 建议。
数据如下所示:
const formattedWorkbook =
[
{
"year": 2016,
"mainHeaderEnglish": "Pearls of Wisdom",
"categoryCode": 3,
},
{
"year": 2017,
"mainHeaderEnglish": "VENuS Satellite",
"categoryCode": 2,
},
{
"year": 2017,
"mainHeaderEnglish": "Hope for millions",
"categoryCode": 1,
},
{
"year": 2012,
"mainHeaderEnglish": "green electricity Pioneer",
"categoryCode": 2
}
]
数据需要如下所示:
const formattedWorkbook =
[
{
"year": 2016,
"value: [
{"mainHeaderEnglish": "Pearls of Wisdom", "categoryCode": 3,}
]
},
{
"year": 2017,
"value":[
{"mainHeaderEnglish": "VENuS Satellite", "categoryCode": 2},
{"mainHeaderEnglish": "Hope for millions", "categoryCode": 1}
]
},
{
"year": 2012,
"value": [
{"mainHeaderEnglish": "green electricity Pioneer", "categoryCode": 2}
]
}
]
这是我的解决方案,但我认为它可能会更好:
let transformedWorkbook = formattedWorkbook.map(function (obj) {
const result = {
year: obj.year,
value: []
}
for (let year in obj) {
if (obj.hasOwnProperty(year) && year !== "year") {
result.value.push({ [year]: obj[year] });
}
}
result.value = [Object.assign({}, ...result.value)]
return result;
});
const newWorkbook = new Map(transformedWorkbook.map(({ year, value }) => [year, { year, value: [] }]));
for (let { year, value } of transformedWorkbook) {
newWorkbook.get(year).value.push(...[value].flat())
};
console.log([...newWorkbook.values()]);
您可以使用 array.reduce 根据 year
:
对数组数据进行分组
const formattedWorkbook =
[
{
"year": 2016,
"mainHeaderEnglish": "Pearls of Wisdom",
"categoryCode": 3,
},
{
"year": 2017,
"mainHeaderEnglish": "VENuS Satellite",
"categoryCode": 2,
},
{
"year": 2017,
"mainHeaderEnglish": "Hope for millions",
"categoryCode": 1,
},
{
"year": 2012,
"mainHeaderEnglish": "green electricity Pioneer",
"categoryCode": 2
}
]
let result = formattedWorkbook.reduce((acc,cur) => {
let { year, ...rest } = cur;
let ex = acc.find(x => x.year === year);
if(!ex){
ex = { year, value: [] };
acc.push(ex);
}
ex.value.push(rest);
return acc;
}, [])
console.log(result);
您仍然可以使用 map
,但从对象中取出 year
,并使用分组结果映射新对象。
件数:
Array.from
takes an iterable, like an Array
or a Map
, where Symbol.iterator
实现了and一个映射函数和returns一个数组。
要获得分组数据集,您可以采用 Array#reduce
,它使用累加器,例如 Map
的实例并迭代给定的对象数组。
要从对象中得到一个属性并保留其余的,
{ year, ...o }
你可以拿一个 destructuring for year
and get the rest if object destructuring。现在你有两个部分,想要的 属性 用于分组,其余部分用于收集价值。
Map#get
takes a value from the instance and Map#set
存储值。
如果没有获取数组作为值,则需要使用默认值
m.get(year) || []
具有 logical OR ||
, which returns the first truthy 值,类似于数组,但不是 undefined
。
这个值 spreaded 与实际对象一起进入一个新数组
[...(m.get(year) || []), o]
作为 Map
的新值。
最后Array.from
的映射函数
([year, value]) => ({ year, value })
对给定 Map
的键和值进行解构,并生成一个新对象 short hand properties 作为新结果。
const formattedWorkbook = [{ year: 2016, mainHeaderEnglish: "Pearls of Wisdom", categoryCode: 3 }, { year: 2017, mainHeaderEnglish: "VENuS Satellite", categoryCode: 2 }, { year: 2017, mainHeaderEnglish: "Hope for millions", categoryCode: 1 }, { year: 2012, mainHeaderEnglish: "green electricity Pioneer", categoryCode: 2 }],
result = Array.from(
formattedWorkbook.reduce((m, { year, ...o }) =>
m.set(year, [...(m.get(year) || []), o]), new Map),
([year, value]) => ({ year, value })
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
你可以使用 lodash:
_.map(formattedWorkbook, el => {
return {
year: el.year,
value: {
mainHeaderEnglish: el.mainHeaderEnglish,
categoryCode: el.categoryCode
}
}
});
如果您更喜欢原生 javascript 函数:
formattedWorkbook.map(el => {
return {
year: el.year,
value: {
mainHeaderEnglish: el.mainHeaderEnglish,
categoryCode: el.categoryCode
}
}
});
所以我找到了解决方案,但我仍在学习并且觉得我的解决方案太长了。它并没有使用全部的 ES6,而且可能会更好。我希望收到任何反馈 and/or 建议。
数据如下所示:
const formattedWorkbook =
[
{
"year": 2016,
"mainHeaderEnglish": "Pearls of Wisdom",
"categoryCode": 3,
},
{
"year": 2017,
"mainHeaderEnglish": "VENuS Satellite",
"categoryCode": 2,
},
{
"year": 2017,
"mainHeaderEnglish": "Hope for millions",
"categoryCode": 1,
},
{
"year": 2012,
"mainHeaderEnglish": "green electricity Pioneer",
"categoryCode": 2
}
]
数据需要如下所示:
const formattedWorkbook =
[
{
"year": 2016,
"value: [
{"mainHeaderEnglish": "Pearls of Wisdom", "categoryCode": 3,}
]
},
{
"year": 2017,
"value":[
{"mainHeaderEnglish": "VENuS Satellite", "categoryCode": 2},
{"mainHeaderEnglish": "Hope for millions", "categoryCode": 1}
]
},
{
"year": 2012,
"value": [
{"mainHeaderEnglish": "green electricity Pioneer", "categoryCode": 2}
]
}
]
这是我的解决方案,但我认为它可能会更好:
let transformedWorkbook = formattedWorkbook.map(function (obj) {
const result = {
year: obj.year,
value: []
}
for (let year in obj) {
if (obj.hasOwnProperty(year) && year !== "year") {
result.value.push({ [year]: obj[year] });
}
}
result.value = [Object.assign({}, ...result.value)]
return result;
});
const newWorkbook = new Map(transformedWorkbook.map(({ year, value }) => [year, { year, value: [] }]));
for (let { year, value } of transformedWorkbook) {
newWorkbook.get(year).value.push(...[value].flat())
};
console.log([...newWorkbook.values()]);
您可以使用 array.reduce 根据 year
:
const formattedWorkbook =
[
{
"year": 2016,
"mainHeaderEnglish": "Pearls of Wisdom",
"categoryCode": 3,
},
{
"year": 2017,
"mainHeaderEnglish": "VENuS Satellite",
"categoryCode": 2,
},
{
"year": 2017,
"mainHeaderEnglish": "Hope for millions",
"categoryCode": 1,
},
{
"year": 2012,
"mainHeaderEnglish": "green electricity Pioneer",
"categoryCode": 2
}
]
let result = formattedWorkbook.reduce((acc,cur) => {
let { year, ...rest } = cur;
let ex = acc.find(x => x.year === year);
if(!ex){
ex = { year, value: [] };
acc.push(ex);
}
ex.value.push(rest);
return acc;
}, [])
console.log(result);
您仍然可以使用 map
,但从对象中取出 year
,并使用分组结果映射新对象。
件数:
Array.from
takes an iterable, like anArray
or aMap
, whereSymbol.iterator
实现了and一个映射函数和returns一个数组。要获得分组数据集,您可以采用
Array#reduce
,它使用累加器,例如Map
的实例并迭代给定的对象数组。要从对象中得到一个属性并保留其余的,
{ year, ...o }
你可以拿一个 destructuring for
year
and get the rest if object destructuring。现在你有两个部分,想要的 属性 用于分组,其余部分用于收集价值。Map#get
takes a value from the instance andMap#set
存储值。如果没有获取数组作为值,则需要使用默认值
m.get(year) || []
具有 logical OR
||
, which returns the first truthy 值,类似于数组,但不是undefined
。这个值 spreaded 与实际对象一起进入一个新数组
[...(m.get(year) || []), o]
作为
Map
的新值。最后
的映射函数Array.from
([year, value]) => ({ year, value })
对给定
Map
的键和值进行解构,并生成一个新对象 short hand properties 作为新结果。
const formattedWorkbook = [{ year: 2016, mainHeaderEnglish: "Pearls of Wisdom", categoryCode: 3 }, { year: 2017, mainHeaderEnglish: "VENuS Satellite", categoryCode: 2 }, { year: 2017, mainHeaderEnglish: "Hope for millions", categoryCode: 1 }, { year: 2012, mainHeaderEnglish: "green electricity Pioneer", categoryCode: 2 }],
result = Array.from(
formattedWorkbook.reduce((m, { year, ...o }) =>
m.set(year, [...(m.get(year) || []), o]), new Map),
([year, value]) => ({ year, value })
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
你可以使用 lodash:
_.map(formattedWorkbook, el => {
return {
year: el.year,
value: {
mainHeaderEnglish: el.mainHeaderEnglish,
categoryCode: el.categoryCode
}
}
});
如果您更喜欢原生 javascript 函数:
formattedWorkbook.map(el => {
return {
year: el.year,
value: {
mainHeaderEnglish: el.mainHeaderEnglish,
categoryCode: el.categoryCode
}
}
});