2017-05-25 166 views
0

我需要对嵌套对象数组进行排序。我写了下面的代码,但由于某些原因,它将第一个元素始终放在返回的数组中,即使它不应该。对嵌套对象排序数组

orderedArray =() => { 
    let sortedArray = products 
    if(this.state.interests.design && this.state.interests.code && this.state.interests.business) 
     sortedArray.sort((a,b)=> (b.scores.quality-a.scores.quality)) 
    else if(this.state.interests.design && this.state.interests.code) 
     sortedArray.sort((a,b) => (b.scores.quality*b.scores.relevancy.code*b.scores.relevancy.design/2)-(a.scores.quality*a.scores.relevancy.code*a.scores.relevancy.design/2)) 
    else if(this.state.interests.design && this.state.interests.business) 
     sortedArray.sort((a,b) => (b.scores.quality*b.scores.relevancy.business*b.scores.relevancy.design/2)-(a.scores.quality*a.scores.relevancy.business*a.scores.relevancy.design/2)) 
    else if(this.state.interests.business && this.state.interests.code) 
     sortedArray.sort((a,b) => (b.scores.quality*b.scores.relevancy.business*b.scores.relevancy.code/2)-(a.scores.quality*a.scores.relevancy.business*a.scores.relevancy.code/2)) 
    else if(this.state.interests.business) 
     sortedArray.sort((a,b)=> (b.scores.quality*b.scores.relevancy.business-a.scores.quality*a.scores.relevancy.busines)) 
    else if(this.state.interests.code) 
     sortedArray.sort((a,b)=> (b.scores.quality*b.scores.relevancy.code-a.scores.quality*a.scores.relevancy.code)) 
    else if(this.state.interests.design) 
     sortedArray.sort((a,b)=> (b.scores.quality*b.scores.relevancy.design-a.scores.quality*a.scores.relevancy.design)) 
    console.log(JSON.stringify(sortedArray)) 
    return sortedArray 
} 

的想法是,如果他们选择的设计,商业和代码,然后将生成的数组应以质量进行排序,否则我的质量和所选择的变量的混合。下面是数据:

[ 
    { 
     "name":"dasd", 
     "scores": { 
      "quality": 8, 
      "relevancy": { 
       "design": 3, 
       "code": 9, 
       "business": 5 
      } 
     }, 
     {...} 
    } 
    {...} 
] 

鉴于this.state是:

this.state = { 
     minutes: int, 
     interests: { 
       business: bool, 
       code: bool, 
       design: bool 
     } 
    } 
+3

请加数据,以及在文字符号。 –

+2

你是什么意思的“*第一个元素总是在返回数组*”? 'sort'不会放置或移除任何东西。 – Bergi

+0

'sortedArray'具有与在操作开始时相同的第一个元素 – ocram

回答

1

使用公式不起作用排序对多个属性的阵列。

鉴于与像{name:'Alice', age:8, grades:{math:12, gym:14}}结构“学生”对象的数组,下面不工作:

// This does not sort by math then gym, it sorts by the result of their products, which is meaningless 
students.sort((a,b) => (a.grades.math*a.grades.gym - b.grades.math*b.grades.gym)) 

正如你可以this Q/A看到,很难在JS实现,但也有库,帮助使这个很直接,就像下划线或lodash

有了你可以做到这一点lodash:

// This sorts by math score, then gym score 
_.sortBy(students, [s => s.grades.math, s => s.grades.gym]) 

现在适用于您的问题,没有给人一种完整的解决方案,在这里是一个暗示:

var data = [...]; 
var propertiesToSortBy = [ o => o.scores.quality ]; 
// Your rules below 
if (...) { 
    propertiesToSortBy = [ o => o.scores.quality, o => o.scores.relevancy.business ]; 
} 
else if (...) { 
    propertiesToSortBy = [ o => o.scores.relevancy.design, o => o.scores.relevancy.business ]; 
} 
else ... 
// Finally, sort 
_.sortBy(data, propertiesToSortBy);