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
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);
}
});
}
});