【问题标题】:Filter and sort nested array of objects过滤和排序嵌套的对象数组
【发布时间】:2020-06-09 12:43:42
【问题描述】:

我有一个对象数组,每个对象都有另一个对象数组,我想通过特定键值过滤它们 - 例如,只返回 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"
           }
          ]
         },
         ...
        ]

【问题讨论】:

  • 返回“jobs”得分最高的那个是一个对象还是一个只包含一个项目的数组?

标签: javascript arrays sorting filter


【解决方案1】:

需要先过滤,再对数组进行排序

// 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

【讨论】:

    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 2020-03-11
    • 2020-03-08
    • 1970-01-01
    • 2020-07-18
    • 2021-08-01
    相关资源
    最近更新 更多