hasOwnProperty() 仅检查某个 属性 是否存在于 JSON 中,但如果不存在则不会 return 任何内容

hasOwnProperty() is only checking if a certain property exists in a JSON, but doesn't return anything if it doesn't

我一直在尝试不同的方法来检查这个 JSON 是否包含“属性”。这样我就可以确定给定的坐标是否在湿地之外。如果他们在湿地,“属性”将存在于JSON中。如果他们不在湿地,'attributes' 就不会在 JSON。

当我 运行 这个函数时,我只得到 TRUE - 当我输入湿地中的坐标时(试试 43.088,在 JSON url,return 正确)。

但是对于给定的 url,我想要 FALSE。出于某种原因,当我执行 console.log("FALSE") 时,控制台中根本没有出现或 return if hasOwnProperty('attributes') == false

我是不是漏掉了什么?

function(GetData) {

  fetch('https://www.fws.gov/wetlandsmapservice/rest/services/Wetlands/MapServer/0/query?where=&text=&objectIds=&time=&geometry=-88.305%2C43.060&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&relationParam=&outFields=WETLAND_TYPE&returnGeometry=false&returnTrueCurves=false&maxAllowableOffset=&geometryPrecision=&outSR=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&returnDistinctValues=false&resultOffset=&resultRecordCount=&queryByDistance=&returnExtentsOnly=false&datumTransformation=&parameterValues=&rangeValues=&f=pjson&__ncforminfo=qCOZOO8Kyr4uogGcKvxkzzuK7gmavd4CxwTAkdbAsF2_aT4eeNbB0NpLwCYwiAJSf1ZHqY3CKVZ3osgMevhYGQrqRUQZej5oHaSmnSIaiZZb469Cexv-zqqmgYMuFJAAzrcRxvKXPBz9VnYPnMrM6kBNhO-cz6yK_w5T1mqNu_VXSbjBSihVf4_mlUBSVb9yf4C8scYXWm9Iak2Nfn1dtJACNUHLBHSElLvc1wxFMO2eUWNsD3qpCk3kAcRyYftuFU86n7THyk2IvkIUpxNmDHRxmmbgSYvPLMkl8t41Jzjp_bntkIyOWB0u8cQU2VsfASFUdznRkvrvYrQxgR8eyvsPq5oV_ZoPSksVCew6xev0K_TV2NU-kjojYpowMVXpZtCX9P-Q_7m8ywt2PyLPhEVgQB12ji1S7G5FRzIt6E0SDoXMY1vqQvPtedaNYbBCazXgs05L9DFKdtvrwmQVCeLmpBTduIhF9Sk4kozMnFX6GOANrZJMCI9AssN0DjrhlZkgDVw0l1flF44Zli927CXGTQ-oUpwsn7PPypVkN2iDJf-nz9XNbj82sv1c6B5s5UZVwiOp8VHJfZSDJ8BAYR4z_oONT2JwbVSKKlFKeN72f-Y6EejcB9wPKmn5kYjv7CKkRyIIv4F4cqVWxLK9x33uvEDMTvxX')
    .then(function(response) {
      return response.json();
    })
    .then(function(data) {
      appendData3(data);
    })

    .catch(function(err) {
      console.log('error: ' + err);
    });


  function appendData3(data) {
    for (let obj of data['features']) {

      if (obj.hasOwnProperty('attributes') == false) {
        console.log("FALSE");
      } else {
        console.log("TRUE");
      }
    }
  }

};

问题是响应中的 data['features'] 是空的。遍历空数组时,for...of 循环中的任何内容都不会执行。

const emptyArray = [];
for (const item of emptyArray) {
  // body is never executed...
}

如果仅检查 data['features'] 中是否存在某个项目就足够了,您可以使用数组的 length

function appendData3(data) {
  if (data.features.length > 0) {
    console.log("TRUE");
  } else {
    console.log("FALSE");
  }
}

要检查其中一个元素是否具有 属性 "attributes",您可以使用 some():

function appendData3(data) {
  if (data.features.some(item => item.hasOwnProperty("attributes"))) {
    console.log("TRUE");
  } else {
    console.log("FALSE");
  }
}

如果您只是想查明某个特定点是否在某个湿地多边形内,您可以让服务器完成这项艰巨的工作并简化您的请求。例如求count.

请参阅 https://developers.arcgis.com/rest/services-reference/enterprise/query-feature-service-layer-.htm

处的 returnCountOnly

我测试了你的代码,这就是问题所在。当坐标在湿地之外时,特征数组为空,这意味着您的 for 循环中没有任何反应。所以这样做而不是直接在你的for循环内部检查

function appendData3(data) {
    // Here we check if features is empty by checking it's length
    if (data['features'].length == 0) {
        console.log("FALSE")
    }

    for (let obj of data['features']) {
        console.log("TRUE");
    }

}

我还看到你的 for 循环每次只获取一个对象,所以不要做 for 循环,就像这样:

function appendData3(data) {
    var obj = data['features'][0]

    if(obj) {
      console.log('TRUE')
    } else {
      console.log('FALSE')
    }
}

如您所见,这次我做得更简单,只需获取第一个特征对象并检查它是否存在。

另外,小提示:当你想检查一个条件是否为假时,不要使用== false,只需在if语句的开头加上感叹号即可。像那样:

if(!obj.hasOwnProperty('attributes')) { 
    // Code here will be executed if the condition is false
} else {
    // Code here will be executed if the condition is true
}

希望这能帮助您解决问题。

祝你有愉快的一天:)