2012-10-08 37 views
2

我有一个项目在Javascript类似于以下的数组:减少与Underscore.js JavaScript的阵列(或与纯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"}} 
]; 

我需要查询(减少)由日期阵列。大于或小于预定日期,例如。当前日期。

我想使用Underscores reduce方法来做到这一点。任何人都可以提供我如何做到这一点的例子吗?

编辑:我想是这样的:

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

+0

你想要什么? *过滤*数组以获得条件的子数组,或*将其减少为单个值(这可能是一个复杂的对象) – Bergi

+0

使用'groupBy'函数可以更容易地实现您所做的事情([demo] (http://jsfiddle.net/cM87e/))。但是,我并没有真正理解你的模糊约简(“*大于或小于日期*”)是什么意思? – Bergi

+0

我需要从数据创建一些图表,所以我打算按时间段将其分解为子数组。例如从今天起30,60,90,120天。由于当前日期将被用作查询的开始日期,我想我只需要关心在每个时期创建一个子数组。 例如 子列表1 - 包含当前日期+ 30天的项目 子列表2 - 包含当前日期+ 60天的项目... etc ..等 – user1513388

回答

1

如果你要过滤的设置,你可以这样做:

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:[]}); 
+0

感谢您对此处的反馈。我想我需要你的第二个例子,因为这似乎使我能够根据日期范围将数据分解成子数组。我可能做了一些愚蠢的事情,但是我在这一行上得到了类型错误:ret.onOrAfter.push(obj); TypeError:无法调用未定义的方法“推” – user1513388

+0

@ user1513388:我忘了将函数名称从'filter'更改为'reduce'。我会更新。 –

+0

阿尔 - 好的!谢谢你的工作完美!我假设,因为这是使用JavaScript日期函数提供的日期可以解析它不仅仅是一个简单的词法字符串匹配日期? – user1513388