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添加了。我看到性能比我现在使用的有所提高。