Mar*_*ark 21 javascript underscore.js momentjs
我试图找出最优的并且用最少量的循环方式来分组我的js日期对象数组:(注意这是浏览器控制台输出它的实际JS日期就像新的Date())
[Sat Aug 08 2015 08:30:00 GMT+0200 (Central Europe Daylight Time), Sat Aug 08 2015 09:30:00 GMT+0200 (Central Europe Daylight Time), Sun Aug 09 2015 08:30:00 GMT+0200 (Central Europe Daylight Time), Sun Aug 09 2015 09:30:00 GMT+0200 (Central Europe Daylight Time), Mon Aug 10 2015 18:00:00 GMT+0200 (Central Europe Daylight Time), Mon Aug 10 2015 23:00:00 GMT+0200 (Central Europe Daylight Time), Tue Aug 11 2015 18:00:00 GMT+0200 (Central Europe Daylight Time), Tue Aug 11 2015 23:00:00 GMT+0200 (Central Europe Daylight Time), Wed Aug 12 2015 18:00:00 GMT+0200 (Central Europe Daylight Time), Wed Aug 12 2015 23:00:00 GMT+0200 (Central Europe Daylight Time)]
Run Code Online (Sandbox Code Playgroud)
在"块"中将同一天的每个日期组合成一个数组,这样我就可以在UI"8月08"上显示它并显示当天内的2或多少日期.
例如:
[{day: 'Aug 08', times:[Sat Aug 08 2015 08:30:00 GMT+0200 (Central Europe Daylight Time), Sat Aug 08 2015 09:30:00 GMT+0200 (Central Europe Daylight Time)]}]
Run Code Online (Sandbox Code Playgroud)
我目前认为这样做的方式是
var startDays = _.map(occurences, function (date) {
return moment(date).startOf('day').format();
});
Run Code Online (Sandbox Code Playgroud)
在那之后获得独特的日子:
_.uniq(startDays, true)
Run Code Online (Sandbox Code Playgroud)
在我得到了独特的日子后,另一个循环将同一天添加到这个组,你现在可以看到你可能会看到为什么我不喜欢它,这就是为什么我希望得到一些聪明的帮助,因为没有任何东西到达我的以此为首.谢谢.
Gru*_*nny 52
Underscore有_.groupBy函数,它应该完全符合你的要求:
var groups = _.groupBy(occurences, function (date) {
return moment(date).startOf('day').format();
});
Run Code Online (Sandbox Code Playgroud)
这将返回一个对象,其中每个键都是一天,值将返回一个包含该日所有出现次数的数组.
要将对象转换为与问题中相同形式的数组,可以使用map:
var result = _.map(groups, function(group, day){
return {
day: day,
times: group
}
});
Run Code Online (Sandbox Code Playgroud)
要进行分组,映射和排序,您可以执行以下操作:
var occurrenceDay = function(occurrence){
return moment(occurrence).startOf('day').format();
};
var groupToDay = function(group, day){
return {
day: day,
times: group
}
};
var result = _.chain(occurences)
.groupBy(occurrenceDay)
.map(groupToDay)
.sortBy('day')
.value();
Run Code Online (Sandbox Code Playgroud)
Rob*_*obG 12
假设您的数据实际上是字符串,我不知道为什么您认为您需要这些库中的任何一个.您只是根据子字符串对字符串进行分组.
ES5引入了reduce,这对于积累东西非常有用:
创建日期数组的助手:
// Generate a dates array given a start date and how many to create:
function genDates(startDate, count) {
var d = new Date(+startDate),
dates = [d];
for (var i=0; i<count; i++) {
d = new Date(+d);
d.setHours(d.getHours() + 10);
dates.push(d);
}
return dates;
}
Run Code Online (Sandbox Code Playgroud)
这个答案最初处理的字符串,修改为与日期一起使用:
// Generate date key 'MMM dd'
// Replaces use of moment.js
function getDateKey(date) {
var d = date.getDate();
var m = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
return m[date.getMonth()] + ' ' + ((d<10?'0':'') + d);
}
// Generate an array in format [{day:'MMM dd', times:[d0, d1, ...]}, ...]
// Replaces use of underscore.js
var obj = dates.reduce(function(acc, d) {
var p = getDateKey(d)
if (!acc[0].hasOwnProperty(p)) acc[0][p] = [];
acc[0][p].push(d);
return acc;
},[{}])
.reduce(function(acc, v){
Object.keys(v).forEach(function(k){acc.push({day:k, times:v[k]})});
return acc;
},[]);
console.log(JSON.stringify(obj));
Run Code Online (Sandbox Code Playgroud)
如果最佳性能是关键,那么对于5到100个日期的数组,上述速度比下划线+ Moment解决方案快20倍.为了加快速度,请删除所有迭代器和库的使用,并使用带有for循环的单个函数.请注意,上面的代码只比使用Moment.js和underscore.js的解决方案长一行.
归档时间: |
|
查看次数: |
26557 次 |
最近记录: |