我希望迭代一个JSON数组,按日期查找给定项目的出现次数。为了说明,我有以下JSON:
"data": [
{
"tags": [
"foo",
"bar",
"hello",
"world",
"alice"
],
"date": [
1402876800000
],
...
},
{
"tags": [
"foo",
"world",
"alice"
],
"date": [
1402963200000
],
...
}
我想要做的是能够调用一个输入标签的函数(例如,' foo'),并在HTML中写入该标签出现多少次日期。所以调用tagOverTime('foo')
会导致类似这样的事情:
06/16/14 - 14次出现
06/17/14 - 8次出现
我还想格式化日期,但我确信自己可以在某个时候使用toLocaleDateString()
来完成此操作。就目前而言,我能够遍历数组,但不是很多。这就是我到目前为止所做的:
$.getJSON('mydata.json', function(data) {
function containsObject(obj, list) {
var i;
for (i = 0; i < list.length; i++) {
if (list[i] === obj) {
return true;
}
}
return false;
}
function tagOverTime(tagtosearch) {
var output="<h4>" + tagtosearch + "</h4><ul>";
for(var i = 0 ; i< data.data.length; i++){
var obj = data.data[i];
var tagsArray = obj["tags"];
// make sure tag array isn't empty
if( tagsArray != undefined ) {
// then iterate through it
for(var j = 0; j < tagsArray.length;j++ ){
// if that tag exists in the given tags array, check its date and count up somehow
if(tagsArray[j] == tagtosearch){
output+='<li>' + obj.date + '</li>';
}
}
}
}
output+="</ul>";
document.getElementById("output").innerHTML=output;
}
tagOverTime('foo');
但我知道这不对,因为它只是输出一个无序的日期列表;我在编写代码时意识到这一点,但不确定如何计算特定日期。
答案 0 :(得分:1)
function tagOverTime(tagToSearch) {
var output="<h4>" + tagtosearch + "</h4><ul>";
var byDate = {};
for (var i = 0; i < data.data.length; i++) {
var obj = data.data[i];
var tagsArray = obj.tags;
if (tagsArray && containsObject(tagToSearch, tagsArray) {
if (byDate[obj.date]) { // Have we already seen this date?
byDate[obj.date]++;
} else { // No, initialize it to 1
byDate[obj.date] = 1;
}
}
}
for (var date in byDate) {
output += '<li>' + date + ' - ' + byDate[date] + ' occurrences</li>';
}
output += '</ul>';
document.getElementById("output").innerHTML=output;
}