在JSON中按日期显示数组出现次数

时间:2014-08-25 21:28:41

标签: javascript arrays json date

我希望迭代一个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');

但我知道这不对,因为它只是输出一个无序的日期列表;我在编写代码时意识到这一点,但不确定如何计算特定日期。

1 个答案:

答案 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;
}