[英]Sort an array inside an array of objects
如果我有大量数组,排序和返回前 5 个项目的最快方法是什么?
对象数组:
[
{
"name" : "placeA",
"menus" : [
{
"sold" : 5,
"name" : "menuA"
},
{
"sold" : 20,
"_id" : "menuB"
},
{
"sold" : 1000,
"_id" : "menuC"
}
]
},
{
"name" : "placeB",
"menus" : [
{
"sold" : 300,
"name" : "menuD"
},
{
"sold" : 400,
"_id" : "menuE"
},
{
"sold" : 50,
"_id" : "menuF"
}
]
},
{
"name" : "placeC",
"menus" : [
{
"sold" : 1500,
"name" : "menuG"
},
{
"sold" : 450,
"_id" : "menuH"
},
{
"sold" : 75,
"_id" : "menuI"
}
]
}
]
预期输出:
[
{
"sold" : 1500,
"name" : "menuG"
},
{
"sold" : 1000,
"_id" : "menuC"
},
{
"sold" : 450,
"_id" : "menuH"
},
{
"sold" : 400,
"_id" : "menuE"
},
{
"sold" : 300,
"name" : "menuD"
}
]
我能想到的唯一可能的方法是创建一个填充所有菜单的数组,然后对菜单进行排序,然后对前 5 个项目进行切片。 我认为这种方式不足以在实际用例中对大量数组集合进行排序。
您可以使用.map()
.reduce()
.concat()
.sort()
和.slice()
var arr = [{ "name": "placeA", "menus": [{ "sold": 5, "name": "menuA" }, { "sold": 20, "_id": "menuB" }, { "sold": 1000, "_id": "menuC" } ] }, { "name": "placeB", "menus": [{ "sold": 300, "name": "menuD" }, { "sold": 400, "_id": "menuE" }, { "sold": 50, "_id": "menuF" } ] }, { "name": "placeC", "menus": [{ "sold": 1500, "name": "menuG" }, { "sold": 450, "_id": "menuH" }, { "sold": 75, "_id": "menuI" } ] } ] var newarr = arr.map(v => v.menus).reduce((a, c) => a.concat(c)); console.log(newarr.sort((a,b) => b.sold - a.sold).slice(0,5));
不过,我不确定这是否是最快的方式。
除了 Yousername 所说的,你也可以你flat
:
array
.map((a) => a.menus) // select menus
.flat() // all sub-array elements concatenated
.sort((a, b) => b.sold - a.sold) // sort by key sold
.slice(0,5) // select the first 5
您可以使用.reduce()
,并使用扩展运算符清理它以在您进行时展平数组,并销毁以直接进入“菜单”数组
const data = [{name:"placeA",menus:[{sold:5,name:"menuA"},{sold:20,_id:"menuB"},{sold:1e3,_id:"menuC"}]},{name:"placeB",menus:[{sold:300,name:"menuD"},{sold:400,_id:"menuE"},{sold:50,_id:"menuF"}]},{name:"placeC",menus:[{sold:1500,name:"menuG"},{sold:450,_id:"menuH"},{sold:75,_id:"menuI"}]}]; let newArray = data .reduce((acc, {menus}) => [...acc, ...menus], []) .sort((a, b) => b.sold - a.sold); console.log(newArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.