按天javascript的功能数量

时间:2016-02-25 16:07:22

标签: javascript json d3.js

我有一个json文档,如下所示:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "time": 1438342780,
        "title": "Iran's foreign minister calls for world's nuclear weapons states to disarm",
        "author": "Julian Borger",
        "web_id": "world/2015/jul/31/iran-nuclear-weapons-states-disarm-israel"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          -77.26526,
          38.90122
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "time": 1438300867,
        "title": "Big bangs over the white cliffs of Dover as unique 1915 artillery gun is fired again",
        "author": "Maev Kennedy",
        "web_id": "world/2015/jul/31/big-bangs-over-white-cliffs-dover-unique-1915-artillery-gun-fired-again"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          1.3,
          51.13333
        ]
      }
    }
  ]
}

我想在json中获取'feature'数组并返回给定日期的功能数量。例如,对于上面的数据,我希望如下:

{
  "date": 7/31/2015,
  "number": 2
}

目前我的内容如下:

d3.json('path/to/json', function(json) {
    data = json;
});

js和d3相当新,所以有点难过。如果您需要更多详细信息,请与我们联系。提前谢谢!

4 个答案:

答案 0 :(得分:2)

这对你有用,它返回一个对象数组。每个对象都是您询问的对象。

var a = yourJSONObject, var map = {}, output = [];
for (var i = 0; i < a.features.length; i++) {
 var ref = new Date(a.features[i].properties.time*1000).toDateString();
 if (map[ref] == undefined) {
  map[ref] = output.push({
    date: ref,
    number: 1
  }) - 1;
 } else 
    output[map[ref]].number++
}

console.log(output) //[ { date: 'Sat Jan 17 1970', number: 2 } ]

答案 1 :(得分:1)

这里的关键部分是您的time值在大纪元时间,这意味着您必须使用this technique将它们转换为预设日期。

然后,您可以遍历要素数组,并跟踪每个日期的计数。

var features = yourJSONObject.features;
var featuresByDate = {};

for (var i = 0, len = features.length; i < len; i++) {
    // find the current feature's date
    var epochTime = features[0].properties.time;
    var date = new Date(0);
    date.setUTCSeconds(epochTime);

    // find the date in 7/31/2015 format
    var dateStr = (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();

    // count the date for the first time if it has not been counted yet
    if ( ! featuresByDate.hasOwnProperty(dateStr) ) {
         featuresByDate[dateStr] = 1;
    }
    // otherwise, increment its counter
    else {
         featuresByDate[dateStr]++;
    }
}

答案 2 :(得分:0)

两个函数 - 一个用于获取correct date based on the epoch time,另一个用于遍历构建临时对象的要素,然后遍历对象以提供日期/数字对象数组。

function getDate(time) {
  var d = new Date(0);
  d.setUTCSeconds(time);
  return [d.getMonth() + 1, d.getDate(), d.getFullYear()].join('/');
}

function getData(data) {
  var obj = data.features.reduce(function(p, c) {
    var date = getDate(c.properties.time);
    p[date] = (p[date] + 1) || 1;
    return p;
  }, {});
  return Object.keys(obj).map(function (el) {
    return { date: el, number: obj[el] };
  });
}

getData(data);

输出

[
  {
    "date": "7/31/2015",
    "number": 2
  }
]

DEMO

答案 3 :(得分:-1)

我不知道D3,但是你可以用JS直接做到这一点:

var json = {
    "features": [{
        "type": "Feature",
        "properties": {
            "time": 1438342780,
            "title": "Iran's foreign minister calls for world's nuclear weapons states to disarm"
        }
    }, {
        "type": "Feature",
        "properties": {
            "time": 1438300867,
            "title": "Big bangs over the white cliffs of Dover as unique 1915 artillery gun is fired again"
        }
    }, {
        "type": "Feature same date",
        "properties": {
            "time": 1448300867,
            "title": "Big bangs over the white cliffs of Dover as unique 1915 artillery gun is fired again"
        }
    }]
}

var counts = {}

function secondsToDate(seconds) {
    var date = new Date(1970,0,1);
    date.setSeconds(seconds);
    return date.toDateString();
}

json.features.reduce((counts, feature) => {
    var date = secondsToDate(feature.properties.time)
    if (counts[date]) {
        counts[date]++
    } else {
        counts[date] = 1
    }
    return counts
}, counts)

console.log(counts) // {'Fri Jul 31 2015': 2, 'Mon Nov 23 2015': 1}

缺少的位是将时间戳解析为日期。

现在分组日期。也许现在,downvoter可以撤消它!

我添加了一个带有复制时间戳的对象,以突出显示计数上升。