使用下划线.js(或纯javascript)减少javascript数组

使用下划线.js(或纯javascript)减少javascript数组,javascript,underscore.js,Javascript,Underscore.js,我在Javascript中有一个类似于以下内容的项目数组: var data = [ {"id":"338b79f07dfe8b3877b3aa41a5bb8a58","date":"2000-10-05T13:21:30Z","value": {"country":"United States"}}, {"id":"338b79f07dfe8b3877b3aa41a5bb983e","date":"2000-02-05T13:21:30Z","value":{"country":"Norwa

我在Javascript中有一个类似于以下内容的项目数组:

var data =
[
{"id":"338b79f07dfe8b3877b3aa41a5bb8a58","date":"2000-10-05T13:21:30Z","value":  {"country":"United States"}},
{"id":"338b79f07dfe8b3877b3aa41a5bb983e","date":"2000-02-05T13:21:30Z","value":{"country":"Norway"}},
{"id":"338b79f07dfe8b3877b3aa41a5ddfefe","date":"2000-12-05T13:21:30Z","value":{"country":"Hungary"}},
{"id":"338b79f07dfe8b3877b3aa41a5fe29d7","date":"2000-05-05T13:21:30Z","value":{"country":"United States"}},
{"id":"b6ed02fb38d6506d7371c419751e8a14","date":"2000-05-05T18:15:30Z","value":{"country":"Germany"}},
{"id":"b6ed02fb38d6506d7371c419753e20b6","date":"2000-12-05T18:15:30Z","value":{"country":"Hungary"}},
{"id":"b6ed02fb38d6506d7371c419755f34ad","date":"2000-06-05T18:15:30Z","value":{"country":"United States"}},
{"id":"b6ed02fb38d6506d7371c419755f3e17","date":"2000-04-05T22:15:30Z","value":{"country":"Germany"}},
{"id":"338b79f07dfe8b3877b3aa41a506082f","date":"2000-07-05T22:15:30Z","value":{"country":"United Kingdom"}},
{"id":"9366afb036bf8b63c9f45379bbe29509","date":"2000-11-05T22:15:30Z","value":{"country":"United Kingdom"}}
];
我需要按日期查询(减少)数组。大于或小于预定日期,如当前日期

我正在考虑使用下划线减少方法来实现这一点。有谁能举例说明我是如何做到这一点的

编辑:我正在尝试以下内容:

var itemsByDate = _(items).reduce(function(memo, item) {
memo[item.date] = memo[item.date] || [];
memo[item.date].push(item);
return memo;
}, {});

console.log((JSON.stringify(itemsByDate["2000-11-05T22:15:30Z"])));​
但这会寻找一个精确的匹配,可能不会正确处理日期,因为它们是字符串

问候,


Carlskii

如果要筛选集合,可以执行以下操作:

var reduced = data.filter(function(obj) {
    var date = +(new Date(obj.date));
    return date < someDate || date > someOtherDate
});
var now = Date.now();

var reduced = data.reduce(function(ret, obj) {
    var date = +(new Date(obj.date));
    if (date < now)
        ret.before.push(obj);
    else
        ret.onOrAfter.push(obj);
    return ret;
}, {before:[], onOrAfter:[]});
var reduced=data.filter(函数(obj){
var日期=+(新日期(目标日期));
返回日期someOtherDate
});
如果要将其缩减为一对集合,可以执行以下操作:

var reduced = data.filter(function(obj) {
    var date = +(new Date(obj.date));
    return date < someDate || date > someOtherDate
});
var now = Date.now();

var reduced = data.reduce(function(ret, obj) {
    var date = +(new Date(obj.date));
    if (date < now)
        ret.before.push(obj);
    else
        ret.onOrAfter.push(obj);
    return ret;
}, {before:[], onOrAfter:[]});
var now=Date.now();
var reduced=数据减少(功能(ret、obj){
var日期=+(新日期(目标日期));
如果(日期<现在)
推前返回(obj);
其他的
向后推(obj);
返回ret;
},{before:[],onOrAfter:[]});

您想要什么?过滤数组以获取某个条件的子数组,或者将其减少为单个值(可能是复杂对象)。使用
groupBy
函数()可以更轻松地实现您所做的操作。然而,我并没有真正理解模糊归约(“大于或小于日期”)的含义?我需要根据数据创建一些图表,所以我要按时间段将其分解为子数组。e、 g.30,60,90120。。。从今天起几天。由于当前日期将用作查询的开始日期,我想我只需要为每个时段创建一个子数组。e、 g.子数组1-包含当前日期+30天的项目子数组2-包含当前日期+60天的项目…等等。请在此查看反馈。我想我需要您的第二个示例,因为它似乎使我能够根据日期范围将数据分解为子数组。我可能在做一些愚蠢的事情,但我在这行中遇到了类型错误:ret.onOrAfter.push(obj);TypeError:无法调用的方法“push”undefined@user1513388:我忘记将函数名从
filter
更改为
reduce
。我会更新的。啊-不错!谢谢,这工作做得很好!我假设,由于这是使用JavaScript日期函数来解析日期,因此它不仅仅是对日期进行简单的词汇字符串匹配?@user1513388:是的,它将字符串转换为日期对象,然后转换为数字(从unix epoch起为毫秒)。另一件事,谢谢!我只是在日期上尝试了第三个选项(if-else),例如“else-if(date