сращивание не работает при использовании цикла for - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь удалить элемент из массива, но он не работает. Я использую следующий код

vm.Continue = function () {
    $scope.invalidList = [];
    if (vm.errorexsist === true) {
        var table = document.getElementById('errortabel');
        for (var r = 0, n = table.rows.length; r < n; r++) {
            if (r > 0) {
                $scope.invalidList.push({
                    Error: table.rows[r].cells[0].val   ,
                    FirstName: table.rows[r].cells[1].children[0].value,
                    Email: table.rows[r].cells[2].children[0].value,
                    PhoneNumber: table.rows[r].cells[3].children[0].value,
                    Location: table.rows[r].cells[4].children[0].value,
                    Department: table.rows[r].cells[5].children[0].value
                });
            }
        }
        var i = $scope.invalidList.length;
        while (i--) {
            if (IsEmailValid($scope.invalidList[i].Email) === true && IsPhoneNumValid($scope.invalidList[i].PhoneNumber) === true) {
                $scope.invalidList.splice(i, 1);
            }
        }  
    }
};

приведенный выше код всегда удаляет элемент в нуле, в то время как условие if else не соответствует.

1 Ответ

5 голосов
/ 04 февраля 2020

Array.splice изменит длину массива, поэтому вы должны выполнять итерацию в обратном направлении по всему массиву, в противном случае каждый раз, когда вы вызываете соединение, индекс и длина для l oop устаревают.

var i = $scope.invalidList.length
while (i--) {
    if (IsEmailValid($scope.invalidList[i].Email) === true && IsPhoneNumValid($scope.invalidList[i].PhoneNumber) === true) {   
        $scope.invalidList.splice(i, 1);   
    }
}

Если вы хотите удалить элементы из массива на основе условия, Array.filter предназначен именно для этой цели:

$scope.invalidList = $scope.invalidList.filter(item => !IsEmailValid(item.Email) || !IsPhoneNumValid(item.PhoneNumber))
...