2017-07-18 103 views
1

我有對象的數組,我怎麼可以去搜索的所有對象,並根據屬性值排序對象

data = [ 
    {key: 1, val: Mon, week: 0}, 
    {key: 1, val: Wed, week: 0}, 
    {key: 1, val: Mon, week: 1}, 
    {key: 1, val: Mon, week: 1} 
    {key: 1, val: Mon, week: 2} 
] 

所需的輸出

week0Array = [{key: 1, val: Mon, week: 0},{key: 1, val: Wed, week: 0}] 
week1Array = [{key: 1, val: Mon, week: 1}, {key: 1, val: Mon, week: 1} ] 
week2Array = [{key: 1, val: Mon, week: 2}] 

我試圖對它們進行分類在lodash中使用find不斷變得不明確

_.find(collection, [predicate=_.identity], [fromIndex=0]) 
+0

剛剛'weekArray [0]','weekArray [1]'等怎麼樣呢?可以接受嗎?另外,'Mon'和'Wed'應該是字符串還是變量引用? –

+0

嗯,它不會列出所有包含'week:0'的對象,例如 – Deano

+0

我想你誤會了我。我問是否可以將所需的輸出調整爲數組而不是單獨的變量。 –

回答

3

您可以使用_.groupBy(collection, [iteratee=_.identity])這樣的:

let data = [ 
 
    {key: 1, val: 'Mon', week: 0}, 
 
    {key: 1, val: 'Wed', week: 0}, 
 
    {key: 1, val: 'Mon', week: 1}, 
 
    {key: 1, val: 'Mon', week: 1}, 
 
    {key: 1, val: 'Mon', week: 2} 
 
] 
 

 
let weekGroups = _.groupBy(data, d => d.week) 
 

 
console.log(weekGroups[0]) 
 
console.log(weekGroups[1]) 
 
console.log(weekGroups[2])
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

請注意,weekGroupsObject而不是Array

+0

請記住,如果您希望您的最終結果按星期排序,那麼您還需要對各個數組進行排序。星期三在星期三之前的唯一原因是GroupG [0]是因爲它是它進入函數的順序。 –

+0

@KyleRichardson是對OP的評論還是你想讓我在我的回答中解決這個問題? OP沒有真正要求這麼做,所以很難說這是否需要。 –

+0

更多有關OP的評論。我假設,(我知道危險的權利?),OP會希望在一週內按周排序。 –

1

就像一個POJS替代方案並假設數據是按排序開始的,reduce可以創建一個數組,並根據星期將數組分組到子數組中。如果需要排序,就可以上漲了呼叫前減少:

var data = [ 
 
    {key: 1, val: "Mon", week: 0}, 
 
    {key: 1, val: "Wed", week: 0}, 
 
    {key: 1, val: "Mon", week: 1}, 
 
    {key: 1, val: "Mon", week: 1}, 
 
    {key: 1, val: "Mon", week: 2} 
 
]; 
 

 
var result = data.reduce((acc, obj, i) => { 
 
    i && acc[acc.length-1].week == obj.week ? 
 
     acc[acc.length-1].push(obj) : 
 
     acc.push([obj]); 
 

 
    return acc; 
 
}, []); 
 

 
console.log(result)

在有條件? :括號不是必需的,但我認爲他們可讀性。