我得到了这个阵列,
我需要在id上分组,但首先要按timestamp排序
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之前对其进行分组:
预期成果:
[
{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的组合来实现这一点。
需要:
发布于 2018-08-08 20:35:13
根据下一项理解:
按id分组,在每个组中按时间戳排序,然后根据最小时间戳(实际上每个组中的第一个时间戳)对组进行排序,并将组划分为平面列表。
_.chain(sample_array)
.groupBy('id')
.mapObject(groupPerId=> _.sortBy(groupPerId, 'timestamp'))
.sortBy(groupPerId=> groupPerId[0].timestamp)
.flatten()
.value()发布于 2018-08-08 20:39:38
您可以按timestamp排序,然后按id排序,但不要使用数字,因为数字是按对象排序的。因此,您需要将数字转换为字符串并按其分组。
然后映射值并使数组变平。
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);.as-console-wrapper { max-height: 100% !important; top: 0; }<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
发布于 2018-08-08 20:22:15
如果这个数组是问题所在,您可以简单地按下面的方式来解决,如果在时间戳中添加了0,则可以使用数字,即每个时间戳的确切数字:),检查它是否应该工作(这个示例是最多5位时间戳),如果它有更多,那么在开始时可以添加零。
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))
})https://stackoverflow.com/questions/51754826
复制相似问题