Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从对象中清除错误的JSON数据?_Javascript_Arrays_Json_Data Cleaning - Fatal编程技术网

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%的数据是坏的,那么性能上的权衡是什么?