2017-03-21 17 views
0
records = [ 
     { 
      name: "Alpha", 
      set: 5, 
      weight: 185 
     },  
     { 
      name: "Alpha", 
      set: 5, 
      weight: 350 
     },   
     { 
      name: "Bravo", 
      set: 5, 
      weight: 185 
     },   
     { 
      name: "Charlie", 
      set: 5, 
      weight: 185 
     },   
     { 
      name: "Delta", 
      set: 5, 
      weight: 185 
     } 
] 

私は複数のレコードのJSON配列を持っており、これらのレコードを名前と重さでフィルタリングする必要があります。たとえば、2つの "Alpha"レコードがあるので、最も重いレコード(2番目のレコード)を引っ張るだけです。私はどのようにフィルタリングし、希望の結果だけでこの配列を再構築するのか分かりません。JSON配列のフィルタリングと並べ替え

私は、私はすべてのテーブルに表示されますよう無傷で元の配列を維持する必要があるが、私は名前で、最大値とオブジェクトだけで二次配列を構築する必要があります。私は関数型プログラミングのアプローチをお勧めします

+0

この同様の質問参照してください:http://stackoverflow.com/a/17037756/6449750 –

答えて

1

私はあなたがlodashの使用を開始し、独自の関数を作成するための時間を過ごすいけないお勧めします。たとえば、次のコードを記述する必要がある名前で、あなたの配列をソートします

var records = [ 
     { 
      name: "Alpha", 
      set: 5, 
      weight: 185 
     },  
     { 
      name: "Alpha", 
      set: 5, 
      weight: 350 
     },   
     { 
      name: "Bravo", 
      set: 5, 
      weight: 185 
     },   
     { 
      name: "Charlie", 
      set: 5, 
      weight: 185 
     },   
     { 
      name: "Delta", 
      set: 5, 
      weight: 185 
     } 
]; 
var sorted = _.sortBy(records, ['name']); 

と第2ケースを、あなたはこのため4+ lodash使用することができます

var filtered = _.filter(records, [ 'name': 'Alpha', 'weight': 350 ]); 
+0

ます。また、[機能]を渡すことができます(https://lodash.com/docs/4.17.4#sortByを) –

+0

これは同じタイプの複数もフィルタリングしますか?これは何かのOPであるフィルタ用 –

+0

望んでいるように使用](https://lodash.com/docs/4.17.4#filter) –

3

:この例では

var newRecords = records 
    .filter(function(record) { 
     return records.find(function(innerRecord) { 
      return innerRecord.name === record.name && innerRecord.weight > record.weight; }) === undefined; 
    }); 

を、あなたが同じ名前を共有するレコードを見つけるが、より大きな重みを持つことができないレコードだけを返します。また、新たに再構築された配列はnewRecordsに格納され、元の配列はそのままです。

2

この最初は名前順と重量順にアイテムをソートし、各項目の最初以外のすべてを除外する。

var records = [{ 
 
    name: "Alpha", 
 
    set: 5, 
 
    weight: 185 
 
    }, 
 
    { 
 
    name: "Alpha", 
 
    set: 5, 
 
    weight: 350 
 
    }, 
 
    { 
 
    name: "Bravo", 
 
    set: 5, 
 
    weight: 185 
 
    }, 
 
    { 
 
    name: "Charlie", 
 
    set: 5, 
 
    weight: 185 
 
    }, 
 
    { 
 
    name: "Charlie", 
 
    set: 5, 
 
    weight: 200 
 
    }, 
 
    { 
 
    name: "Delta", 
 
    set: 5, 
 
    weight: 185 
 
    } 
 
] 
 

 
console.log(
 
    records.sort((a, b) => { 
 
    if (a.name === b.name) { 
 
     return a.weight >= b.weight ? -1 : 1 
 
    } 
 
    return a.name > b.name ? 1 : -1 
 
    }) 
 
    .filter((rec, i, arr) => { 
 
    if (i === 0) return true 
 
    return rec.name !== arr[i - 1].name 
 
    }) 
 
)

4

名や重量によってフィルタリングします。

var sortedArray = _.orderBy(レコード、['weight']、['desc']));

これは重量で配列をソートします。 その後、 _.uniqBy(sortedArray、 '名前')

この最終配列を返します。

var records = [ 
     { 
      name: "Alpha", 
      set: 5, 
      weight: 185 
     },  
     { 
      name: "Alpha", 
      set: 5, 
      weight: 350 
     },   
     { 
      name: "Bravo", 
      set: 5, 
      weight: 185 
     },   
     { 
      name: "Charlie", 
      set: 5, 
      weight: 185 
     },   
     { 
      name: "Delta", 
      set: 5, 
      weight: 185 
     } 
] 

var sortedArray = _.orderBy(records, ['weight'], ['desc']) 

_.uniqBy(sortedArray,'name')