性能上按项目元素值拆分数组的最佳方法

时间:2019-02-06 12:11:28

标签: javascript arrays

我有很多这样的东西

staging-branch

我想按元素的值将项目拆分为类似的内容

var array = [
    { id: 1, category: 'Apple' },
    { id: 2, category: 'Orange' },
    { id: 3, category: 'Orange' },
    { id: 4, category: 'Grape' },
    { id: 5, category: 'Grape' },
]

这是我目前使用的:

var newArray = [
    [
        { id: 1, category: 'Apple' },
    ],
    [
        { id: 2, category: 'Orange' },
        { id: 3, category: 'Orange' },
    ],
    [
        { id: 4, category: 'Grape' },
        { id: 5, category: 'Grape' },
    ],
]

但是当放置1000-10000个大型阵列时,速度非常慢。

在性能方面做到最好的方法是什么?

1 个答案:

答案 0 :(得分:4)

这就是我要怎么做。我首先将数组简化为一棵树(一个对象),其键为类别。插入和访问对象的复杂度应为O(log n),但是JavaScript语言规范并未规定这些函数的时间复杂度。

然后从那棵树中进行迭代,以获取每个键的值并将其推入数组。

const array = [
    { id: 1, category: 'Apple' },
    { id: 2, category: 'Orange' },
    { id: 3, category: 'Orange' },
    { id: 4, category: 'Grape' },
    { id: 5, category: 'Grape' },
];

const result = Object.values(array.reduce((accum, { id, category }) => {
  accum[category] = accum[category] || [];
  accum[category].push({ id, category });
  return accum;
}, {}));

console.log(result);