Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按项拆分数组的最佳性能方法';s元素值_Javascript_Arrays - Fatal编程技术网

Javascript 按项拆分数组的最佳性能方法';s元素值

Javascript 按项拆分数组的最佳性能方法';s元素值,javascript,arrays,Javascript,Arrays,我有很多这样的东西 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: '

我有很多这样的东西

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 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个项目的大型阵列上,速度非常慢


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

我会这样做的。我首先将数组简化为一棵树(一个对象),它的键是类别。插入和访问对象的复杂度应为
O(logn)
,但是JavaScript语言规范并不要求这些函数具有时间复杂度

从该树中,我将迭代以获取每个键的值,并将它们推送到一个数组中

const数组=[
{id:1,类别:'Apple'},
{id:2,类别:'橙色'},
{id:3,类别:'橙色'},
{id:4,类别:'葡萄'},
{id:5,类别:'葡萄'},
];
const result=Object.values(array.reduce((accum,{id,category})=>{
累计[类别]=累计[类别]| |[];
accum[category].push({id,category});
返回累计;
}, {}));

控制台日志(结果)请添加您已经尝试过的内容。@NinaScholz添加了。我看到性能比我现在使用的有所提高。