0

我有一个非常大的 Json 文件(数据集大于 30 000)。我需要检查某个键的一部分值是否与给定的字符串相同,然后增加一个 int。

这是 Json 的一部分:

[
    {
        "geo": null,
        "coordinates": null,
        "in_reply_to_status_id_str": null,
        "contributors": null,
        "in_reply_to_user_id": null,
        "in_reply_to_status_id": null,
        "truncated": false,
        "created_at": "Tue Nov 13 20:17:17 +0000 2012"

我想检查键“created_at”是否有某一天(值)。例如 'Tue' 然后递增:var tuesday = 0;

我唯一能想到的就是这个功能:

function getValues(obj, key) {
    var objects = [];
    for (var i in obj) {
        if (!obj.hasOwnProperty(i)) continue;
        if (typeof obj[i] == 'object') {
            objects = objects.concat(getValues(obj[i], key));
        } else if (i == key) {
            objects.push(obj[i]);
        }
    }
    return objects;
}

但它只检查键并将值放入数组中。那不是我想要的。

4

2 回答 2

3

从您的问题中无法立即清楚数据的结构是什么,但它看起来是一个对象数组,其中 created_at 属性将填充一个日期。如果您需要它是递归的(您提供的代码建议),则需要修改以下代码。但是脱离描述:

我想检查键“created_at”是否有某一天(值)。例如'Tue'然后递增:var tuesday = 0;

然后以下将采用数组作为并生成包含一个对象data的变量,该对象具有天的映射以及属性以每周 7 天字符串中的每一个开头的项目数。valuecreated_at

var valMap = {
  Sun: 'sunday',
  Mon: 'monday',
  Tue: 'tuesday',
  Wed: 'wednesday',
  Thu: 'thursday',
  Fri: 'friday',
  Sat: 'saturday'
}

var value = data.reduce(function(m, i, x){
  for (d in valMap){
    if (i.created_at.indexOf(d) === 0){
      m[valMap[d]]++;
      return m;
    }
  }
  return m;
}, {
  sunday: 0,
  monday: 0,
  tuesday: 0,
  wednesday: 0,
  thursday: 0,
  friday: 0,
  saturday: 0
});

结果类似于:

{
  sunday: 0,
  monday: 1,
  tuesday: 3,
  wednesday: 0,
  thursday: 1,
  friday: 0,
  saturday: 6
}
于 2013-01-09T01:37:21.890 回答
0

如果您想查看对象的字段名称中是否存在键,请使用 indexOf

 function getValues(obj, key) {
        var objects = [];
        for (var i in obj) {
            if (!obj.hasOwnProperty(i)) continue;
            if (typeof obj[i] == 'object') {
                objects = objects.concat(getValues(obj[i], key));
            } else if (s.indexOf(key) !== -1) {
                objects.push(obj[i]);
            }
        }
        return objects;
    }
于 2013-01-09T01:36:27.833 回答