javascript - 如何修改对象数组以按最近年份分组?

标签 javascript arrays ecmascript-6 javascript-objects

我目前有一个像这样的对象数组:

const array = [
  { key: 'model_1', year: 2019, displayOrder: 1},
  { key: 'model_1', year: 2018, displayOrder: 2},
  { key: 'model_2', year: 2018, displayOrder: 3},
  { key: 'model_3', year: 2018, displayOrder: 4},
  { key: 'model_4', year: 2019, displayOrder: 5},
  { key: 'model_5', year: 2018, displayOrder: 6},
];

我正在尝试生成一个新数组,该数组按当前上一年对对象进行分组,并按displayOrder对订单进行分组。如果我们将其应用于上面的数组,它将如下所示:

const array = {
  current: [
    { key: 'model_1', year: 2019, displayOrder: 1 },
    { key: 'model_2', year: 2018, displayOrder: 3 },
    { key: 'model_3', year: 2018, displayOrder: 4 },
    { key: 'model_4', year: 2019, displayOrder: 5 },
    { key: 'model_5', year: 2018, displayOrder: 6 },
  ],
  previous: [
    { key: 'model_1', year: 2018, displayOrder: 2 },
    { key: 'model_4', year: 2018, displayOrder: 7 },
  ],
};

其背后的理论是它应该显示模型的当前版本。这将基于模型的最近一年。

我尝试过创建一个按年份对它们进行分组的归约函数,但我认为这不是正确的方法,因为与进一步修改相比,可能会产生大量开销。

const modelsByYear = array.reduce((acc, model) => {
  acc[model.year] = acc[model.year] || [];
  acc[model.year].push(model);
  return acc;
}, Object.create(null));

关于如何做到这一点,有哪些建议?

编辑:

我需要这个的原因是为了过滤。如果我点击当前上一个,我需要查看相应的型号。

最佳答案

您可以检查 key 并拼接当前数组或推送到前一个数组。

const array = [{ key: 'model_1', year: 2019, displayOrder: 1 }, { key: 'model_1', year: 2018, displayOrder: 2 }, { key: 'model_2', year: 2018, displayOrder: 3 }, { key: 'model_3', year: 2018, displayOrder: 4 }, { key: 'model_4', year: 2019, displayOrder: 5 }, { key: 'model_5', year: 2018, displayOrder: 6 }, { key: 'model_4', year: 2018, displayOrder: 7 }],
    grouped = array.reduce((r, o) => {
        var index = r.current.findIndex(({ key }) => o.key === key);
        if (index !== -1) {
            if (r.current[index].year > o.year) {
                r.previous.push(o);
                return r;
            }
            r.previous.push(r.current.splice(index, 1)[0]);
        }
        r.current.push(o);
        return r;
    }, { current: [], previous: [] });

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 如何修改对象数组以按最近年份分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51177388/

相关文章:

javascript - Bootstrap TreeView 不起作用 - 传递的对象仍然没有输出

javascript - 什么相当于 Chrome 开发工具中的 Firebug DOM 选项卡?

javascript - 在代码中使用 client_secret 的 Chrome 扩展

java - 如何在 Java 中将 List<Integer> 转换为 int[]?

javascript - 子组件可以访问其包含组件的方法吗?

javascript - 为什么数组在 reduce 中不可迭代

javascript - 循环对象时 array.filter 未定义

javascript - 为什么 ES6 Symbol 属性可以被 Object.defineProperty 枚举?

javascript - Node 中的 For-of 循​​环 --harmony 不适用于数组

javascript - babel-loader 不转换 webpack.config.js