【问题标题】:Loop through JSON value and return a different value遍历 JSON 值并返回不同的值
【发布时间】:2019-07-11 09:20:14
【问题描述】:

所以我有以下 JSON,我正在尝试遍历它,找到与 2019-07-13 14:40:50 GMT 匹配的 sdate,但返回 link 值。

最好的方法是什么?

{
    "status": "ok",
    "data": {
        "Gallery": {
            "gallery_id": "***ID***",
            "GalleryImage": [{
                    "image_id": "***ID***",
                    "gallery_id": "***ID***",
                    "Image": {
                        "image_id": "***ID***",
                        "gallery_id": "***ID***",
                        "ImageLink": {
                            "link": "URL"
                        },
                        "Iptc": {
                            "sdate": "2019-07-11 14:40:50 GMT"
                        }
                    }
                },
                {
                    "image_id": "***ID***",
                    "gallery_id": "***ID***",
                    "Image": {
                        "image_id": "***ID***",
                        "gallery_id": "***ID***",
                        "ImageLink": {
                            "link": "***URL***"
                        },
                        "Iptc": {
                            "sdate": "2019-07-12 14:40:50 GMT"
                        }
                    }
                },
                {
                    "image_id": "***ID***",
                    "gallery_id": "***ID***",
                    "Image": {
                        "image_id": "***ID***",
                        "gallery_id": "***ID***",
                        "ImageLink": {
                            "link": "***URL***"
                        },
                        "Iptc": {
                            "sdate": "2019-07-13 14:40:50 GMT"
                        }
                    }
                }
            ]
        }
    }
}

我的理解是我需要使用for循环,比如:

for (var key in **ID**) {
    if (**ID*.hasOwnProperty(key)) {
    }
}

在 Panos K 的帮助下,我有以下工作,但它可能不是最好的方法?

let initArray = {
  "status": "ok",
  "data": {
    "Gallery": {
      "gallery_id": "***ID***",
      "GalleryImage": [{
          "image_id": "***ID***",
          "gallery_id": "***ID***",
          "Image": {
            "image_id": "***ID***",
            "gallery_id": "***ID***",
            "ImageLink": {
              "link": "LINK1"
            },
            "Iptc": {
              "sdate": "2019-07-11 14:40:50 GMT"
            }
          }
        },
        {
          "image_id": "***ID***",
          "gallery_id": "***ID***",
          "Image": {
            "image_id": "***ID***",
            "gallery_id": "***ID***",
            "ImageLink": {
              "link": "LINK2"
            },
            "Iptc": {
              "sdate": "2019-07-13 14:40:50 GMT"
            }
          }
        },
        {
          "image_id": "***ID***",
          "gallery_id": "***ID***",
          "Image": {
            "image_id": "***ID***",
            "gallery_id": "***ID***",
            "ImageLink": {
              "link": "LINK3"
            },
            "Iptc": {
              "sdate": "2019-07-13 14:40:50 GMT"
            }
          }
        }
      ]
    }
  }
}

function getImgLinksByDate(initArray, date){
  return initArray.data
    .Gallery
    .GalleryImage
    .filter(i=>i.Image.Iptc.sdate==date)
    .map(i=>i.Image.ImageLink.link);
}

links = getImgLinksByDate(initArray, '2019-07-13 14:40:50 GMT');

links.forEach(function (item) {
    var div = document.getElementById('divID');
  div.innerHTML += '<div>' + item + '</div>';
});

【问题讨论】:

  • 尝试使用 Codable 解析 JSON。

标签: arrays json loops


【解决方案1】:

你可以使用这个我已经使用了一些硬代码值,假设值保持不变你可以添加检查代码是否存在

将其视为 sudo 示例

date = "2019-07-13 14:40:50 GMT"

let a = {
  "status": "ok",
  "data": {
    "Gallery": {
      "gallery_id": "***ID***",
      "GalleryImage": [{
          "image_id": "***ID***",
          "gallery_id": "***ID***",
          "Image": {
            "image_id": "***ID***",
            "gallery_id": "***ID***",
            "ImageLink": {
              "link": "URLA"
            },
            "Iptc": {
              "sdate": "2019-07-11 14:40:50 GMT"
            }
          }
        },
        {
          "image_id": "***ID***",
          "gallery_id": "***ID***",
          "Image": {
            "image_id": "***ID***",
            "gallery_id": "***ID***",
            "ImageLink": {
              "link": "***URLB***"
            },
            "Iptc": {
              "sdate": "2019-07-12 14:40:50 GMT"
            }
          }
        },
        {
          "image_id": "***ID***",
          "gallery_id": "***ID***",
          "Image": {
            "image_id": "***ID***",
            "gallery_id": "***ID***",
            "ImageLink": {
              "link": "***URLC***"
            },
            "Iptc": {
              "sdate": "2019-07-13 14:40:50 GMT"
            }
          }
        }
      ]
    }
  }
}

let arr = a.data.Gallery.GalleryImage;

for (i = 0; i < arr.length; i++) {
  if (arr[i].Image && arr[i].Image.Iptc && arr[i].Image.Iptc.sdate && arr[i].Image.Iptc.sdate == date) {
    console.log(arr[i].Image.ImageLink.link)
  }

}

【讨论】:

    【解决方案2】:

    使用Array.find()

    let data = {
        "status":"ok",
        "data":{
            "Gallery":{
                "gallery_id":"***ID***",
                "GalleryImage":[
                    {
                        "image_id":"***ID***",
                        "gallery_id":"***ID***",
                        "Image":{
                            "image_id":"***ID***",
                            "gallery_id":"***ID***",
                            "ImageLink":{
                                "link":"URL"
                            },
                            "Iptc":{
                                "sdate":"2019-07-11 14:40:50 GMT"
                            }
                        }
                    },
                    {
                        "image_id":"***ID***",
                        "gallery_id":"***ID***",
                        "Image":{
                            "image_id":"***ID***",
                            "gallery_id":"***ID***",
                            "ImageLink":{
                                "link":"***URL***"
                            },
                            "Iptc":{
                                "sdate":"2019-07-12 14:40:50 GMT"
                            }
                        }
                    },
                    {
                        "image_id":"***ID***",
                        "gallery_id":"***ID***",
                        "Image":{
                            "image_id":"***ID***",
                            "gallery_id":"***ID***",
                            "ImageLink":{
                                "link":"***URL***"
                            },
                            "Iptc":{
                                "sdate":"2019-07-13 14:40:50 GMT"
                            }
                        }
                    }
                ]
            }
        }
    };
    
    function getLinkByDate(data, date) {
      const found = data.data.Gallery.GalleryImage.find(gi => gi.Image.Iptc.sdate === date);
      return found ? found.Image.ImageLink.link : undefined;
    }
    
    console.log(getLinkByDate(data, "2019-07-13 14:40:50 GMT"));

    【讨论】:

      【解决方案3】:

      您可以像这样使用过滤器和映射创建更通用的方法(如果找到两次日期,也会返回数组中的 url)

      function getImgLinksByDate(initArray, date){
        return initArray.data
          .Gallery
          .GalleryImage
          .filter(i=>i.Image.Iptc.sdate==date)
          .map(i=>i.Image.ImageLink.link);
      }
      

      【讨论】:

      • 谢谢,这似乎对我有用。我添加了一个循环,以便可以将其输出到 HTML。你会(介意看看吗?一定是更好的方法吗?
      • @Victor 在我看来不错,替代方法是使用 createElement 方法并修改 innerHTML developer.mozilla.org/en-US/docs/Web/API/Document/createElement
      • 谢谢。另一个快速的。是否可以只查询 YYY-MM-DD 所以使用: getImgLinksByDate(initArray, '2019-07-13') 所以无论时间+时区如何,都可以在当天获取所有 URL。也许substr() 不知何故?...这有意义吗?
      • 我想我有它:return initArray.data.Gallery.GalleryImage.filter(i=&gt;i.Image.Iptc.sdate.substr(0,10)==date).map(i=&gt;i.Image.ImageLink.link); 似乎可以解决问题。
      • @Victor yes 在最后一行(映射)你可以返回任何类似 .map(i=>{return {link: i.Image.ImageLink.link, sdate:i.Image.Iptc .sdate }});试试看!
      猜你喜欢
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 2011-10-12
      相关资源
      最近更新 更多