簡體   English   中英

在對象數組中對數組進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM