Javascript 从对象中清除错误的JSON数据?
我正在从服务中检索建筑地理位置数据,但是在某些情况下,某些数据将丢失属性 良好数据Javascript 从对象中清除错误的JSON数据?,javascript,arrays,json,data-cleaning,Javascript,Arrays,Json,Data Cleaning,我正在从服务中检索建筑地理位置数据,但是在某些情况下,某些数据将丢失属性 良好数据 [{ "ModifiedOn": "2015-04-29 11:17:28.0", "BuildingName": "Wintefell", "Latitude": "52.900619", "Longitude": "-1.434602", "Region": "The North", }, { "ModifiedOn": "2015-04-29 11:17:28
[{
"ModifiedOn": "2015-04-29 11:17:28.0",
"BuildingName": "Wintefell",
"Latitude": "52.900619",
"Longitude": "-1.434602",
"Region": "The North",
}, {
"ModifiedOn": "2015-04-29 11:17:28.0",
"BuildingName": "Water Gardens",
"Latitude": "51.818051",
"Longitude": "-.354871",
"Region": "Dorne"
}]
坏数据
[{
"ModifiedOn": "2015-04-29 11:17:28.0",
"BuildingName": "Wintefell",
"Latitude": "52.900619",
"Longitude": "-1.434602",
"Region": "The North",
}, {
"ModifiedOn": "2015-04-29 11:17:28.0",
"BuildingName": "Water Gardens",
"Latitude": "51.818051",
"Longitude": "-.354871",
"Region": "Dorne"
}]
缺少区域或建筑名称
{
"ModifiedOn": "2015-04-29 11:17:28.0",
"BuildingName": "Kings Landing",
"Latitude": "23.818051",
"Longitude": "-.154871",
}
发出AJAX请求后,我将JSON响应存储在一个名为_regionAndBuildings的对象中
我想清除其中的任何错误数据,所以我尝试了以下代码
console.log("Starting size of building data : " + _regionAndBuildings.length);
//clean json by setting object to undefined
for (var i = 0; i < _regionAndBuildings.length; i++) {
if (_regionAndBuildings[i].BuildingName === undefined && _regionAndBuildings[i].Region === undefined) {
console.log("Deleting");
delete _regionAndBuildings[i];
}
}
console.log("Ending size of building data after cleaning : " + _regionAndBuildings.length);
console.log(“建筑数据的起始大小:”+_regionand buildings.length);
//通过将对象设置为未定义来清除json
对于(变量i=0;i<_regionand buildings.length;i++){
如果(_regionand buildings[i].BuildingName==未定义&&&u Region and buildings[i].Region==未定义){
控制台日志(“删除”);
删除区域和建筑物[i];
}
}
console.log(“清理后建筑物数据的结束大小:”+_regionand buildings.length);
输出
起始尺寸:209
删除x 17
收尾尺寸:209
为什么这段代码没有删除我的JSON对象中的坏元素?代码中有两个问题
{
"ModifiedOn": "2015-04-29 11:17:28.0",
"BuildingName": "Kings Landing",
"Latitude": "23.818051",
"Longitude": "-.154871",
}
要删除缺少区域或建筑名称的元素。但情况并没有反映出这一点
if (_regionAndBuildings[i].BuildingName === undefined &&
_regionAndBuildings[i].Region === undefined)
由于您使用了&
运算符,因此只有当两个表达式都满足时,才会执行if
条件中的代码。因此,您需要使用逻辑OR运算符|
对其进行更改,如下所示
if (_regionAndBuildings[i].BuildingName === undefined ||
_regionAndBuildings[i].Region === undefined)
_regionAndBuildings.splice(i, 1);
var filteredBuildings = _regionAndBuildings.filter(function (currentObject) {
return currentObject.hasOwnProperty("BuildingName") &&
currentObject.hasOwnProperty("Region");
});
delete
运算符时,数组中的元素将被删除,但索引将不指向任何内容。这意味着数组的长度不会改变。阅读更多关于它的文章
相反,你可以这样使用
if (_regionAndBuildings[i].BuildingName === undefined ||
_regionAndBuildings[i].Region === undefined)
_regionAndBuildings.splice(i, 1);
var filteredBuildings = _regionAndBuildings.filter(function (currentObject) {
return currentObject.hasOwnProperty("BuildingName") &&
currentObject.hasOwnProperty("Region");
});
但是,我更喜欢在没有你不想要的元素的情况下重建数组,像这样
if (_regionAndBuildings[i].BuildingName === undefined ||
_regionAndBuildings[i].Region === undefined)
_regionAndBuildings.splice(i, 1);
var filteredBuildings = _regionAndBuildings.filter(function (currentObject) {
return currentObject.hasOwnProperty("BuildingName") &&
currentObject.hasOwnProperty("Region");
});
现在,传递的函数将与数组中的所有项一起运行,只有当函数返回true
,对象才会包含在过滤结果中。因此,如果对象同时具有BuildingName
和Region
属性,那么它将被包括在结果中
注意:我更喜欢使用检查对象中是否存在属性,而不是将值与未定义的
进行比较,因为如果属性的值实际上是未定义的,因此,我们无法区分不存在的属性和值未定义的属性
您可以尝试:
if (typeof _regionAndBuildings[i].BuildingName === "undefined"
&& typeof _regionAndBuildings[i].Region === "undefined")
{
console.log("Deleting");
_regionAndBuildings.splice(i, 1);
}
第一个原因-您使用&&
而不是|
:
_regionAndBuildings[i].BuildingName === undefined && _regionAndBuildings[i].Region === undefined
但是你说:
坏数据
缺少区域或建筑名称
{
"ModifiedOn": "2015-04-29 11:17:28.0",
"BuildingName": "Kings Landing",
"Latitude": "23.818051",
"Longitude": "-.154871",
}
第二个原因-当您通过delete
从数组中删除元素时,会得到一个未定义的间隙:
[<elem>, undefined, <elem>]
但最好的方法是使用slice
而不是delete
:
_regionAndBuildings.splice(i, 1);
您可以通过另一种方法来实现,即使用数组来获得良好的值:
var goodRegionAndBuildings = _regionAndBuildings.filter(function(item) {
// assumes not-empty strings are good
// everything else is bad
return (
item.ModifiedOn !== "" &&
item.BuildingName !== "" &&
item.Latitude !== "" &&
item.Longitude !== "" &&
item.Region !== ""
);
});
在你给出的例子中
{
"ModifiedOn": "2015-04-29 11:17:28.0",
"BuildingName": "Kings Landing",
"Latitude": "23.818051",
"Longitude": "-.154871",
}
缺少属性BuildingName
或Region
。使用hasOwnProperty
而不是\u region and buildings[i]更合适。BuildingName==未定义的
for (var i = 0; i < _regionAndBuildings.length; i++){
if (!(_regionAndBuildings[i].hasOwnProperty('BuildingName')) && !(_regionAndBuildings[i].hasOwnProperty('Region'))) {
console.log("Deleting");
_regionAndBuildings.splice(i, 1);
}
}
for(变量i=0;i<\u region and buildings.length;i++){
如果(!((地区和建筑物[i].hasOwnProperty('BuildingName'))和(!(地区和建筑物[i].hasOwnProperty('Region')){
控制台日志(“删除”);
_区域和建筑物.拼接(i,1);
}
}
尝试使用数组。拼接而不是删除。如果(!(arr[i].BuildingName&!arr[i].Region))
也可以使用而不是。检查每个对象的大小如何?如果我知道好的数据有6个属性。因此,如果属性大小小于6,那么您将不知道缺少哪些属性,对吗?如果95%的数据是好的,而5%的数据是坏的,那么性能上的权衡是什么?