重组对象数组然后对对象进行分组

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