start index first div javascript angularjs array-splice

javascript - index - ng-repeat angularjs



angularjs forEach y empalme (6)

Tengo una matriz como esta:

$scope.emails = [ {"key":"Work","value":"[email protected]"}, {"key":"","value":""}, {"key":"Work","value":"[email protected]"} {"key":"","value":""}];

Por lo tanto, quiero eliminar los correos electrónicos vacíos, pero el método angular para forEach método elimina solo un objeto que es el último objeto, ¿por qué?

código js

angular.forEach($scope.emails, function(email, index){ if(email.value ===""){ $scope.emails.splice(index, 1); } });

donde estoy haciendo mal

Js bin


Como han señalado otros, el culpable del código es la matriz que se eliminó. Para moverse con angular.forEach, puede probar el enfoque de aditivo / asignación:

var filteredEmails = []; angular.forEach($scope.emails, function(email, index){ if(email.value !==""){ filteredEmails.push(email); } }); $scope.emails = filteredEmails;


De acuerdo con los docs , la función de iterador permite un tercer parámetro que es la colección que se está iterando. La unión de esa colección en lugar de $scope.emails eliminará el objeto esperado.

angular.forEach($scope.emails, function(email, index, obj){ if(email.value ===""){ obj.splice(index, 1); } });


El problema es que elimina elementos de la matriz durante el bucle, por lo que los elementos posteriores se encuentran en índices diferentes. Necesitas ir hacia atrás en su lugar:

for (var i = $scope.emails.length - 1; i >= 0; i--) { if (!$scope.emails[i].value) { $scope.emails.splice(i, 1); } }

Aquí hay un ejemplo actualizado .


No he probado esto con AngularJs, pero con Angular 4 una forma similar funciona bastante bien.

angular.forEach($scope.emails, function(email){ if(email.value ===""){ $scope.emails.splice($scope.emails.indexOf(email), 1); } });

Versión angular 4:

this.emailArray.forEach(email => { if (email.value == "") { this.emailArray.splice(this.emailArray.indexOf(email),1); } });


indexOf devuelve -1 cuando no encuentra un elemento.

Una forma de eliminar un elemento, y de evitar eliminar el último cuando no se encuentra, es:

var index = $scope.items.indexOf($scope.oldItem); if (index != -1) { $scope.items.splice(index, 1); }


describe(''Foreach Splice'', function () { it(''splicing'', function () { var elements = [ {name: "Kelly", age: 16}, {name: "", age: 17}, {name: "Becky", age: 18}, {name: "", age: 18}, {name: "Sarah", age: 19}, {name: "", age: 20}, {name: "", age: 22}, {name: "Mareck", age: 21}, {name: "", age: 21}, {name: "Mareck", age: 21} ]; removeEmptyEntry(elements); console.log(elements); }); function removeEmptyEntry(elements) { elements.forEach(function (element, index) { if (!element.name) { elements.splice(index, 1); removeEmptyEntry(elements); } }); } });