2017-05-25 8 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 
} 

アイデアは、彼らがデザイン、ビジネス、コードを選択した場合、その後結果の配列は、品質、品質と選択された変数のそうでなければ、私のミックスによってソートされなければならないということです。 this.state一方

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

である:

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);