2015-09-25 45 views
0

这是我的JSON代码。我将这个json存储在一个数组中。如何使用Javascript读取JSON数组以获取值(如果存在)

{ 
"kind": "urlshortener#url", 
"id": "http://goo.gl/2FIrtF", 
"longUrl": "http://hike.com/?utm_source=facebook", 
"status": "OK", 
"created": "2015-09-22T13:45:53.645+00:00", 
"analytics": { 
    "allTime": { 
     "shortUrlClicks": "1", 
     "longUrlClicks": "1", 
     "referrers": [ 
      { 
       "count": "1", 
       "id": "unknown" 
      } 
     ], 
     "countries": [ 
      { 
       "count": "1", 
       "id": "IN" 
      } 
     ], 
     "browsers": [ 
      { 
       "count": "1", 
       "id": "Chrome" 
      } 
     ], 
     "platforms": [ 
      { 
       "count": "1", 
       "id": "Macintosh" 
      } 
     ] 
    }, 
    "month": { 
     "shortUrlClicks": "1", 
     "longUrlClicks": "1", 
     "referrers": [ 
      { 
       "count": "1", 
       "id": "unknown" 
      } 
     ], 
     "countries": [ 
      { 
       "count": "1", 
       "id": "IN" 
      } 
     ], 
     "browsers": [ 
      { 
       "count": "1", 
       "id": "Chrome" 
      } 
     ], 
     "platforms": [ 
      { 
       "count": "1", 
       "id": "Macintosh" 
      } 
     ] 
    }, 
    "week": { 
     "shortUrlClicks": "1", 
     "longUrlClicks": "1", 
     "referrers": [ 
      { 
       "count": "1", 
       "id": "unknown" 
      } 
     ], 
     "countries": [ 
      { 
       "count": "1", 
       "id": "IN" 
      } 
     ], 
     "browsers": [ 
      { 
       "count": "1", 
       "id": "Chrome" 
      } 
     ], 
     "platforms": [ 
      { 
       "count": "1", 
       "id": "Macintosh" 
      } 
     ] 
    }, 
    "day": { 
     "shortUrlClicks": "0", 
     "longUrlClicks": "0" 
    }, 
    "twoHours": { 
     "shortUrlClicks": "0", 
     "longUrlClicks": "0" 
    } 
}, 
"result": { 
    "kind": "urlshortener#url", 
    "id": "http://goo.gl/2FIuvF", 
    "longUrl": "http://hike.com/?utm_source=facebook", 
    "status": "OK", 
    "created": "2015-09-22T13:45:53.645+00:00", 
    "analytics": { 
     "allTime": { 
      "shortUrlClicks": "1", 
      "longUrlClicks": "1", 
      "referrers": [ 
       { 
        "count": "1", 
        "id": "unknown" 
       } 
      ], 
      "countries": [ 
       { 
        "count": "1", 
        "id": "IN" 
       } 
      ], 
      "browsers": [ 
       { 
        "count": "1", 
        "id": "Chrome" 
       } 
      ], 
      "platforms": [ 
       { 
        "count": "1", 
        "id": "Macintosh" 
       } 
      ] 
     }, 
     "month": { 
      "shortUrlClicks": "1", 
      "longUrlClicks": "1", 
      "referrers": [ 
       { 
        "count": "1", 
        "id": "unknown" 
       } 
      ], 
      "countries": [ 
       { 
        "count": "1", 
        "id": "IN" 
       } 
      ], 
      "browsers": [ 
       { 
        "count": "1", 
        "id": "Chrome" 
       } 
      ], 
      "platforms": [ 
       { 
        "count": "1", 
        "id": "Macintosh" 
       } 
      ] 
     }, 
     "week": { 
      "shortUrlClicks": "1", 
      "longUrlClicks": "1", 
      "referrers": [ 
       { 
        "count": "1", 
        "id": "unknown" 
       } 
      ], 
      "countries": [ 
       { 
        "count": "1", 
        "id": "IN" 
       } 
      ], 
      "browsers": [ 
       { 
        "count": "1", 
        "id": "Chrome" 
       } 
      ], 
      "platforms": [ 
       { 
        "count": "1", 
        "id": "Macintosh" 
       } 
      ] 
     }, 
     "day": { 
      "shortUrlClicks": "0", 
      "longUrlClicks": "0" 
     }, 
     "twoHours": { 
      "shortUrlClicks": "0", 
      "longUrlClicks": "0" 
     } 
    } 
} 

}

在上面的JSON,我们怎么能得到分析的存在 - >日 - >国家?

我想知道这些国家是否在一天之内存在,如果不存在,则显示一些价值。如果它在那里,它将尝试获取特定国家的计数。

我试图从最后5小时没有任何运气。

if(arr.analytics.day.countries !== undefined) { 
     function thingscount(arr, platf) { 
      var x = arr.analytics.day.countries.map(function(el) { 
      return (platf.indexOf(el.id) != -1) ? parseInt(el.count) : 0; }); 
      var count = 0; 
      for (var i = 0; i < x.length; i++) count += x[i]; 
      return count; 
      }  

     var one = thingscount(arr, ["US"]); 

     }else{ 
      var one = 0; 

     } 

上面的代码工作,如果有在日国家罚款,但有时,在我的JSON就没有平台的一部分,在这种情况下,它给了我

Uncaught TypeError: Cannot read property 'map' of undefined 

我需要一种方法检查平台是否存在,是否需要计数,如果没有给变量赋予其他值。

UPDATE:

我用下面的代码这获得的计数。

当它具有IN键和值时,它会给出结果。但是当它没有IN键时,它显示'undefined count'错误。

var month_inclicks = arr.analytics.month.countries.filter(function(el) { return el.id == "IN"; })[0].count;

我们如何可以设置默认值,如果我们正在寻找的关键是不存在?

+0

这不是JSON。 http://jsonlint.com/ – Quentin

+0

对不起,有效的JSON更新。 – Anvy

回答

3

虽然这不是JSON,我假设它是一个javascript对象。这就是说,你会想利用hasOwnProperty方法或in关键字。

例子:

if (arr.total.limited.hasOwnProperty('platforms')) { //do stuff 

if ('platforms' in arr.total.limited) { //do something 
+0

刚纠正了json。你能再次检查问题吗? – Anvy

+0

仍然无效,请参阅http://jsonlint.com/。这就是说,它并没有真正改变我的答案。如果你已经把它编组成一个JavaScript对象,你可以简单地使用'hasOwnProperty'或'in'。 – CollinD

+0

我使用下面的代码来计算IN的数量。 当它有IN键和值时,它给我的结果。但是当它没有IN键时,它显示'undefined count'错误。 'var month_inclicks = arr.analytics.month.countries.filter(function(el){return el.id ==“IN”;})[0] .count;' 如何设置默认值if我们正在寻找的关键不存在? – Anvy

2

我纠正了JSON。使用hasOwnProperty作为@CollinD建议

var arr = { 
    total: { 
     limited: { 
      things: "451", 
      platforms: [{ 
       count: "358", 
       id: "Windows" 
      }, { 
       count: "44", 
       id: "X11" 
      }, { 
       count: "42", 
       id: "Macintosh" 
      }, { 
       count: "2", 
       id: "Linux" 
      }, { 
       count: "1", 
       id: "iPhone" 
      }, { 
       count: "1", 
       id: "iPod" 
      }] 

     } 
    } 
}; 

Object.prototype.hasOwnProperty()

console.log(arr.total.limited.hasOwnProperty('platforms')); 

DEMO

0

根据记录,您可以通过降低滚动你的 'thingscount' 功能地图和计数成一个操作:

var getCount = function getCount(ary, find) { 
    return ary.reduce(function (acc, record) { 
     if (find.indexOf(record.id) !== -1) acc += parseInt(record.count, 10); 
     return acc; 
    }, 0); 
}; 

用法在线:

if (arr.analytics.day.hasOwnProperty('countries')) { 
    var find = ['IN'], 
     count = arr.analytics.day.countries.reduce(function (acc, record) { 
      if (find.indexOf(record.id) !== -1) acc += parseInt(record.count, 10); 
      return acc; 
     }, 0); 
} 

或者与功能:

if (arr.analytics.day.hasOwnProperty('countries')) { 
    var count = getCount(arr.analytics.day.countries, ['US','IN']); 
} 
+0

用示例更新了我的代码。 – Shilly

+0

如果使用空数组作为输入,则不会找到indexOf,并返回默认acc(umulator)值0。像'getCount(arr.analytics.day.countries,[]);'应该返回0. – Shilly

+0

if(find.indexOf(record.id)!== -1)'if'(find.indexOf (record.id)!== -1 && record.hasOwnProperty('count'))'如果你有一个国家有一个ID,但没有计数,它不会抛出一个错误。 0来自于减少自己,因为我们通过0作为'acc'的起始值。所有处于'find'数组中并具有计数值的国家将被添加到我们传入的0中。如果find数组为空,或者数组中没有国家有计数,则我们通过的0在从来没有得到一个数字添加到它,所以结果保持为0. – Shilly