首页 > 解决方案 > 过滤和排序嵌套的对象数组

问题描述

我有一个对象数组,每个对象都有另一个对象数组,我想通过特定的键值过滤它们 - 例如,只返回name: "jobs"的对象。

之后,我想对公司数组中的所有对象进行排序,并返回“工作”得分最高的对象。

我不确定解决此问题的最佳方法是什么。

这是原始的对象数组:

        companies = [
         {
         about:"Dolore occaecat cillum."
         address:"Manhattan Court, 445"
         city:"Brecon, Massachusetts"
         email:"info@ziggles.info"
         id:0
         name:"Ziggles"
         phone:"+1 (944) 472-2911"
         postal_code:33
         project_number:2016823
         scores:[
           {
             name:"jobs"
             score:"2.7"
           },
           {
             name:"facility"
             score:"4.2"
           },
           {
             name:"location"
             score:"4.7"
           }
         ]
         },
         ...
        ]

我想过滤数组分数并为公司数组中的每个对象返回以下结构

        companies = [
         {
         about:"Dolore occaecat cillum."
         address:"Manhattan Court, 445"
         city:"Brecon, Massachusetts"
         email:"info@ziggles.info"
         id:0
         name:"Ziggles"
         phone:"+1 (944) 472-2911"
         postal_code:33
         project_number:2016823
         scores:[
           {
             name:"jobs"
             score:"2.7"
           }
          ]
         },
         ...
        ]

标签: javascriptarrayssortingfilter

解决方案


您需要先过滤,然后对数组进行排序

// remove extra details of companies to make code easier to read
companies = [
         {
     
         id:0,
 
    
         scores:[
           {
             name:"jobs",
             score:"2.7"
           },
           {
             name:"facility",
             score:"4.2"
           },
           {
             name:"location",
             score:"4.7"
           }
         ],
         },
           {
      
         name:"C2",
    
         scores:[
           {
             name:"jobs",
             score:"3"
           },
           {
             name:"facility",
             score:"4.2"
           },
           {
             name:"location",
             score:"4.7"
           }
         ]
         },
           {
  
         name:"C3",
     
         scores:[
         
           {
             name:"facility",
             score:"4.2"
           },
           {
             name:"location",
             score:"4.7"
           }
         ]
         },
         
        ]
        

 // if companies is a big array you might want to combine filter an
const newCompanies = companies.filter(comp => comp.scores.find(scoreObject => scoreObject.name === 'jobs')).sort((comp1, comp2) =>  parseFloat(comp2.scores.find(scoreObject => scoreObject.name === 'jobs').score, 10) - parseFloat(comp1.scores.find(scoreObject => scoreObject.name === 'jobs').score,10))
console.log(newCompanies) // first element will have highest score


推荐阅读