Javascript 无法访问已删除的数组对象

Javascript 无法访问已删除的数组对象,javascript,arrays,angularjs,object,Javascript,Arrays,Angularjs,Object,我们正在开发一个应用程序,可以显示员工的班次列表。如果一个移位已经通过,我们希望将其从移位数组中删除,因此不将其打印到DOM中 我们使用数组的delete属性有效地删除对象。这样做,我们知道删除将使对象保持未定义状态。 然而,当它在屏幕上打印时,会出现未定义的内容(这一部分很有意义),但当我们试图用函数获取它们以解决此问题时(我们将在没有未定义的情况下复制数组),我们无法达到未定义的内容 我们怎样才能找到那些未定义的 HTML: <ul> <li ng-repeat="

我们正在开发一个应用程序,可以显示员工的班次列表。如果一个移位已经通过,我们希望将其从移位数组中删除,因此不将其打印到DOM中

我们使用数组的
delete
属性有效地删除对象。这样做,我们知道删除将使对象保持未定义状态。 然而,当它在屏幕上打印时,会出现未定义的内容(这一部分很有意义),但当我们试图用函数获取它们以解决此问题时(我们将在没有未定义的情况下复制数组),我们无法达到未定义的内容

我们怎样才能找到那些未定义的

HTML

<ul>
    <li ng-repeat="shift in CurrentUser.orderedSchedule = (schedule | orderBy:Time.getSortingDate:false)">
        <p>Start time: {{Time.makeDate(shift.start)}} 
        {{Time.makeTime(shift.start)}}</p>
        <p>end time: {{Time.makeDate(shift.end)}} 
        {{Time.makeTime(shift.end)}}</p>
    </li>
</ul>
$scope.getShifts = function(){
    $scope.schedule = $scope.CurrentUser.user.shifts; //array of objects that gets printed on screen
    var now = new Date();
    for (var indexOfShift in $scope.schedule){ //checks each shift
        var start = $scope.schedule[indexOfShift].start; //date object, the start of the shift
        if(start instanceof Date){
            if(parseInt(start.getTime())-parseInt(now.getTime())<0){
                //if the 'future time' has already passed now
                //remove the shift
                alert(start+" is in the past");
                delete $scope.CurrentUser.user.shifts[indexOfShift]; //deleting shift
                $scope.schedule = $scope.CurrentUser.user.shifts; //trying to update that we removed it, so we can find undefined
            }
        }
    }
    for(var indexOfShift in $scope.schedule){ //looping shifts again to look for undef
        console.log($scope.schedule[indexOfShift]); //this prints all of them but the undefines don't appear
        if($scope.schedule[indexOfShift].start===undefined){ //we never hit this
            alert("found a blank one");
        }
    }
};
为什么我们不能到达未定义的地方?它们到哪里去了?

for(arr中的var i)循环将不会通过未定义的项进行循环。两种解决方案:

  • 使用arr[indexOfShift]=null代替delete arr[indexOfShift]
  • 使用如下数值循环代替for(arr中的var i):
  • 对于(var i=0;i}

    为您的箱子使用接头

     //delete $scope.CurrentUser.user.shifts[indexOfShift]; 
    $scope.CurrentUser.user.shifts.splice(indexOfShift, 1);
    
    在这种情况下,“删除”只会将元素设置为未定义:

    myArray=['a','b','c','d']

    删除myArray[0]

    myArray

    结果:[未定义的“b”、“c”、“d”]

    “拼接”实际上会从阵列中删除图元:

    myArray=['a','b','c','d']

    myArray.splice(0,2)

    myArray

    结果:[“c”、“d”]

    有关拼接的详细信息:

    例如,Mizzila:

    var myFish =["angel", "clown", "drum", "mandarin", "surgeon"];
    
    //removes 1 element from index 3
    removed = myFish.splice(3, 1);
    //myFish is ["angel", "clown", "drum", "surgeon"]
    //removed is ["mandarin"]
    
    在你的情况下使用这个

     //delete $scope.CurrentUser.user.shifts[indexOfShift]; 
    $scope.CurrentUser.user.shifts.splice(indexOfShift, 1);