Javascript在循环中从JSON获取值

时间:2016-09-26 12:16:13

标签: javascript json node.js

我有以下问题,我想从json获取所有polyline.points数据:

"legs" : [
        {
           "distance" : {
              "text" : "115 km",
              "value" : 115373
           },
           "duration" : {
              "text" : "1 hour 14 mins",
              "value" : 4433
           },
           "duration_in_traffic" : {
              "text" : "1 hour 10 mins",
              "value" : 4205
           },
           "end_address" : "Ermelo, Netherlands",
           "end_location" : {
              "lat" : 52.2986269,
              "lng" : 5.629653999999999
           },
           "start_address" : "Zwijndrecht, Netherlands",
           "start_location" : {
              "lat" : 51.8108387,
              "lng" : 4.6268639
           },
           "steps" : [
              {
                 "distance" : {
                    "text" : "45 m",
                    "value" : 45
                 },
                 "duration" : {
                    "text" : "1 min",
                    "value" : 9
                 },
                 "end_location" : {
                    "lat" : 51.81113269999999,
                    "lng" : 4.627318
                 },
                 "html_instructions" : "Head \u003cb\u003enortheast\u003c/b\u003e on \u003cb\u003eKorenbloemstraat\u003c/b\u003e toward \u003cb\u003eLeeuwenbekstraat\u003c/b\u003e",
                 "polyline" : {
                    "points" : "whf{H{tf[y@{A"
                 },

在这个json中有多个polyline.points键。 我有以下代码,但它不起作用:

//console.log(body.routes[0].legs[0].steps[0].polyline.points);
    var keys = [];
    for(var i = 0;i<body.routes[0].legs[0].steps.length;i++)
    {
    Object.keys(body.routes[0].legs[0].steps[i]).forEach(function(value){
    if(value == 'polyline') {
      Object.keys(value).forEach(function(value){
        console.log(value);


    }
});

有人能帮助我吗?谢谢!

2 个答案:

答案 0 :(得分:0)

嘿你的'value'变量包含(key,value)对。所以使用值['折线']来获取数据。

答案 1 :(得分:0)

legs是一个对象的属性,但你还没有说过,如果该级别只有一个对象,或者它是否是数组的一部分,但是如果它不是很难修改。

您可以使用reduce将legs.steps数组转换为一个大数组,然后将其映射以提取polyline.points

这样,如果legs数组或steps数组中有多个元素,它就可以正常工作。请注意,如果polyline未定义,它将抛出异常,因此您需要添加某种形式的错误检查。

var data = data.legs.reduce((prev, cur) => {
    prev.push(...cur.steps);

    return prev;
  }, [])
  .map(x => x.polyline.points);

Fiddle

Reduce Docs

Map docs

Spread operator

编辑:根据OP评论修改:

这个Fiddle只会盲目地期望收到一个对象并从中获取第一个routes对象。

第二个Fiddle会将routessteps压缩成一个大的坐标数组。我知道你说你不需要,但这似乎是一个有趣的挑战:)

仅供参考,因为它符合ES6标准,因此IE就是其中之一。