javascript - 过滤和排序嵌套的对象数组
问题描述
我有一个对象数组,每个对象都有另一个对象数组,我想通过特定的键值过滤它们 - 例如,只返回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"
}
]
},
...
]
解决方案
您需要先过滤,然后对数组进行排序
// 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