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=¶meterValues=&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
- https://www.fws.gov/wetlandsmapservice/rest/services/Wetlands/MapServer/0/query?geometry=-88.305%2C43.060&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnCountOnly=true&f=pjson
- https://www.fws.gov/wetlandsmapservice/rest/services/Wetlands/MapServer/0/query?geometry=-88.305%2C43.088&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnCountOnly=true&f=pjson
我测试了你的代码,这就是问题所在。当坐标在湿地之外时,特征数组为空,这意味着您的 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
}
希望这能帮助您解决问题。
祝你有愉快的一天:)
我一直在尝试不同的方法来检查这个 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=¶meterValues=&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- https://www.fws.gov/wetlandsmapservice/rest/services/Wetlands/MapServer/0/query?geometry=-88.305%2C43.060&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnCountOnly=true&f=pjson
- https://www.fws.gov/wetlandsmapservice/rest/services/Wetlands/MapServer/0/query?geometry=-88.305%2C43.088&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnCountOnly=true&f=pjson
我测试了你的代码,这就是问题所在。当坐标在湿地之外时,特征数组为空,这意味着您的 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
}
希望这能帮助您解决问题。
祝你有愉快的一天:)