首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >_.groupBy但_.sort优先

问_.groupBy但_.sort优先
EN

Stack Overflow用户
提问于 2018-08-08 20:07:47
回答 3查看 323关注 0票数 1

我得到了这个阵列,

我需要在id上分组,但首先要按timestamp排序

代码语言:javascript
复制
sample_array = [
    {id: 21, timestamp:1, year: 2012},
    {id: 11, timestamp:2, year: 2017},
    {id: 12, timestamp:3, year: 2016},
    {id: 11, timestamp:4, year: 2014},
    {id: 11, timestamp:5, year: 2015},
    {id: 19, timestamp:6, year: 2016},
    {id: 12, timestamp:7, year: 2016}
    ]

我尝试使用underscore.js实现的是首先使用时间戳对数组进行排序,然后检查是否存在相同id的另一个条目,然后在下一个id之前对其进行分组:

预期成果:

代码语言:javascript
复制
[
    {id: 21, timestamp:1, year: 2012},
    {id: 11, timestamp:2, year: 2017},
    {id: 11, timestamp:4, year: 2014},
    {id: 11, timestamp:5, year: 2015},
    {id: 12, timestamp:3, year: 2016},
    {id: 12, timestamp:7, year: 2016},
    {id: 19, timestamp:6, year: 2016}
]

我试图通过使用_.groupBy和_.sortBy的组合来实现这一点。

需要:

  1. 按id分组
  2. 按组中的时间戳进行排序
  3. 按最小时间戳对组进行排序(每个组中的第一个时间戳)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-08 20:35:13

根据下一项理解:

按id分组,在每个组中按时间戳排序,然后根据最小时间戳(实际上每个组中的第一个时间戳)对组进行排序,并将组划分为平面列表。

代码语言:javascript
复制
_.chain(sample_array)
 .groupBy('id')
 .mapObject(groupPerId=> _.sortBy(groupPerId, 'timestamp'))
 .sortBy(groupPerId=> groupPerId[0].timestamp)
 .flatten()
 .value()
票数 1
EN

Stack Overflow用户

发布于 2018-08-08 20:39:38

您可以按timestamp排序,然后按id排序,但不要使用数字,因为数字是按对象排序的。因此,您需要将数字转换为字符串并按其分组。

然后映射值并使数组变平。

​

代码语言:javascript
复制
var array = [{ id: 21, timestamp:1, year: 2012 }, { id: 11, timestamp:2, year: 2017 }, { id: 12, timestamp:3, year: 2016 }, { id: 11, timestamp:4, year: 2014 }, { id: 11, timestamp:5, year: 2015 }, { id: 13, timestamp:6, year: 2016 }, { id: 12, timestamp:7, year: 2016 }],
    result = _.chain(array)
        .sortBy(['timestamp'])
        .groupBy(o => _ + o.id)
        .map(v => v)
        .flatten()
        .value();

console.log(result);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

​

票数 2
EN

Stack Overflow用户

发布于 2018-08-08 20:22:15

如果这个数组是问题所在,您可以简单地按下面的方式来解决,如果在时间戳中添加了0,则可以使用数字,即每个时间戳的确切数字:),检查它是否应该工作(这个示例是最多5位时间戳),如果它有更多,那么在开始时可以添加零。

代码语言:javascript
复制
    sample_array.sort(function(a,b){
return Number(a.id.toString()+('00000'+a.timestamp.toString()).substr(a.timestamp.toString().length-1))-Number(b.id.toString()+('00000'+b.timestamp.toString()).substr(b.timestamp.toString().length-1))
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51754826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档