【问题标题】:Javascript/GAS: Count the number of object occurrences in JSON responseJavascript/GAS:计算 JSON 响应中对象出现的次数
【发布时间】:2020-01-27 15:44:53
【问题描述】:

所以我的函数通过外部 API 从项目系统获取时间条目。对时间条目求和的条件是审批状态需要有某个值(> 0)。现在我想添加另一个条件 (&&),以便 每天 天必须至少有一个带有值的审批状态(即,计算审批状态的数量等于或大于 5计算发生)。这是为了强制用户输入一周中的每一天的条目。我该怎么做?这是我尝试过的,不知道该怎么做。 PS:这是为许多用户计算的。

var response = UrlFetchApp.fetch(url, options);
var info = JSON.parse(response.getContentText());
var content = info.data;
var total_hours = 0;
var count = 0;



for (var j = 0; j < content.length; j++) {
    if (content[j].approvals.data.length > 0 && count >= 5) {

        total_hours += content[j].hours;

    }
}

Logger.log(total_hours)

}

示例 JSON 数据

{"paging":{"per_page":20,"page":1,"previous":null,"self":"/api/v1/users/678108/time_entries?assignable_id=&fields=approvals&from=2020 -01-20&to=2020-01-24&user_id=678108&page=1","next":"/api/v1/users/678108/time_entries?assignable_id=&fields=approvals&from=2020-01-20&to=2020-01-24&user_id= 678108&page=2"},"data":[{"id":1661350010,"assignable_id":2993759,"assignable_type":"Project","user_id":678108,"bill_rate":0.1,"bill_rate_id":37032684, "date":"2020-01-20","hours":0.0,"scheduled_hours":null,"notes":null,"task":null,"is_suggestion":false,"created_at":"2020-01 -21T17:32:22Z","updated_at":"2020-01-24T15:08:22Z","approvals":{"paging":{"self":"../time_entries/1661350010/approvals?per_page= 0&page=1","next":null,"previous":null,"page":1,"per_page":0},"data":[]}},

【问题讨论】:

  • 你可以使用reduce函数来达到这个目的。
  • @demkovych,感谢您查看代码。请告诉我怎么做。
  • 你能分享你的数据吗?
  • @demkovych 请查看我编辑的问题以获取示例 JSON 响应
  • 您的approvals.data 数组的结构是什么?有一些对象,它有状态属性?

标签: javascript api loops google-apps-script counting


【解决方案1】:

const data = [
  {
    "id": 1661350010,
    "assignable_id": 2993759,
    "assignable_type": "Project",
    "user_id": 678108,
    "bill_rate": 0.1,
    "bill_rate_id": 37032684,
    "date": "2020-01-20",
    "hours": 5,
    "scheduled_hours": null,
    "notes": null,
    "task": null,
    "is_suggestion": false,
    "created_at": "2020-01-21T17:32:22Z",
    "updated_at": "2020-01-24T15:08:22Z",
    "approvals": {
      "paging": {
        "self": "../time_entries/1661350010/approvals?per_page=0&page=1",
        "next": null,
        "previous": null,
        "page": 1,
        "per_page": 0
      },
      "data": [{
        'status': 'approved'
      }, {
        'status': 'approved'
      }, {
        'status': 'approved'
      },{
        'status': 'approved'
      },{
        'status': 'approved'
      },{
        'status': 'approved'
      },{
        'status': 'error'
      }]
    }
  }
];

const total = data.reduce((acc, el) => {
  const {hours, approvals: {data}} = el;
  if (data.length && data.filter(e => e.status === 'approved').length >= 5) {
    acc += hours;
  }
  return acc;
}, 0);

console.log(total);

要使其在 Apps 脚本中工作并记录结果,您必须使用 reduce 函数,如下所示:

const total = data.reduce(function(acc, el) {
  var hours = el.hours;
  var data = el.approvals.data;

  if (data.length && data.filter(function(element) { return element.status === 'approved'}).length >= 5) {
    acc += hours;
  }
  return acc;
}, 0);

Logger.log(total);

【讨论】:

  • 感谢@demkovych,但是,这种风格的 JS 不能在 Google 应用脚本控制台 (GAS) 中运行。我是 javascript 的新手,如果你告诉我如何在 GAS 中运行它会很高兴
  • 我从未使用过 GAS。您有想法,需要根据您的需要进行调整。
  • GAS 是 ES5。没有=&gt;...
猜你喜欢
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2020-05-15
  • 1970-01-01
  • 2020-02-06
  • 2019-03-02
相关资源
最近更新 更多