2017-07-18 128 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)

在有条件? :括号不是必需的,但我认为他们可读性。