【问题标题】:JSON/JS Object accessing key when you don't know the name in Google Apps Script当您不知道 Google Apps 脚本中的名称时,JSON/JS 对象访问密钥
【发布时间】:2014-01-12 15:23:12
【问题描述】:

我正在处理来自 Google 应用脚本中 Webtrends API 的响应,并且我有一个如下所示的 JSON/JS 对象:

"data": [
    {
        "period": "Month",
        "start_date": "2013-12",
        "end_date": "2013-12",
        "attributes": {},
        "measures": {
            "Visits": 500
        },
        "SubRows": [
            {
                "facebook.com": {
                    "attributes": {},
                    "measures": {
                        "Visits": 100
                    },
                    "SubRows": null
                },
                "google.co.uk": {
                    "attributes": {},
                    "measures": {
                        "Visits": 100
                    },
                    "SubRows": null
                },
                "newsnow.co.uk": {
                    "attributes": {},
                    "measures": {
                        "Visits": 100
                    },
                    "SubRows": null
                },
                "No Referrer": {
                    "attributes": {},
                    "measures": {
                        "Visits": 100
                    },
                    "SubRows": null
                },
                "t.co": {
                    "attributes": {},
                    "measures": {
                        "Visits": 100
                    },
                    "SubRows": null
                }
            }
        ]
    }
]

我需要访问的是名称,即 facebook.com 等...并访问每个 SubRows 的号码。

我能够获得访问号码,但我不知道如何获得姓名。请注意,名称会不断变化,因为不同的网站每天会发送不同的流量。

获取访问号码时我的代码部分:

for(i in dObj){
var data = dObj[i].SubRows;
var sd = dObj[i].start_date;
var ed = dObj[i].end_date;

if(sd == ed){
    var timep = ""+ sd;
  }
  else{
    var timep = ""+ sd + "-" + ed;
  }

var subRows = data[0];

Logger.log(subRows);

for(i in subRows){

  var row = subRows[i];
  var rmeasures = row.measures;
  var rvis = rmeasures.Visits;

  values = [timep,"",rvis]; //Blank string for where the name of the site would go
}

}

我尝试了以下链接,但似乎都没有答案:

Getting JavaScript object key list How to access object using dynamic key? How to access key itself using javascript How do I access properties of a javascript object if I don't know the names?

我只是使用香草谷歌应用程序脚本,因为我对 Jquery 等没有任何经验......

任何帮助将不胜感激!

【问题讨论】:

    标签: javascript json google-apps-script javascript-objects webtrends


    【解决方案1】:

    我通常使用如下所示的小辅助函数:

    var keyVal = function(o) {
        var key = Object.keys(o)[0];
        return {"key": key, "val":o[key]};
    } ;
    

    这会将具有可变键的对象映射到键/值对象 {key:...., val:{}},这通常很方便使用。

    describe.only ("stack overflow answer", function(){
    
        it ("is should create a key/value pair" , function(){
    
            var res = keyVal(  {
                "facebook.com": {
                    "attributes": {},
                    "measures": {
                        "Visits": 100
                    },
                    "SubRows": null
                }});
            res.key.should.equal('facebook.com');
            res.val.attributes.should.deep.equal({});
        });
    

    【讨论】:

      【解决方案2】:

      在循环中,变量i 包含当前键。用i 替换空字符串应该可以满足您的需求。

      【讨论】:

        【解决方案3】:

        您可能还想看看 Javascript 中内置的一些功能更强大的工具。一些更简洁的代码也可能更明确:

        data.map(function(datum) {
            var timep = datum.start_date == datum.end_date ? datum.end_date : 
                    (data.start_date + "-" + datum.end_date);  
            return datum.SubRows.map(function(subRow) {
                return Object.keys(subRow).map(function(key) {
                    return [timep, key, subRow[key].measures.Visits];
                });
            });
        });
        

        会返回一个类似这样的对象:

        [
            [
                [
                    ["2013-12", "facebook.com", 100],
                    ["2013-12", "google.co.uk", 100],
                    ["2013-12", "newsnow.co.uk", 100],
                    ["2013-12", "No Referrer", 100],
                    ["2013-12", "t.co", 100 ]
                ]
            ]
        ] 
        

        这只是使用mapObject.keys 来简化您使用显式循环所做的一些事情。

        【讨论】:

          猜你喜欢
          • 2021-12-10
          • 2019-07-26
          • 1970-01-01
          • 1970-01-01
          • 2016-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多