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

3

我有一个非常大的数组,类似于这样

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' },
    ],
]

这是我目前使用的:

var array = [
    { id: 1, category: 'Apple' },
    { id: 2, category: 'Orange' },
    { id: 3, category: 'Orange' },
    { id: 4, category: 'Grape' },
    { id: 5, category: 'Grape' }
];
var categories = [];
array.forEach(function(item) {
    categories.push(item.category);
});
var uniqueCategories = categories.filter(function(item, pos) {
    return categories.indexOf(item) == pos;
});
var newArray = []
uniqueCategories.forEach(function(category, index) {
  array.forEach(function(item) {
    if (item.category === category) {
      if (!newArray[index]) {
        newArray[index] = [];
      }
      newArray[index].push(item);
    }
  });
});

但是在1000-10000项的大数组上运行非常缓慢。

如何以最佳性能完成它?


3
请说明您已经尝试过的方法。 - Nina Scholz
@NinaScholz 已添加。 - Jeremy John
1个回答

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


我发现这个比我目前使用的更能提高性能。 - Jeremy John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接