angularjs forEach et splice
j'ai un tableau comme ceci:
$scope.emails = [
{"key":"Work","value":"user@domine.com"},
{"key":"","value":""},
{"key":"Work","value":"user2@domine.com"}
{"key":"","value":""}];
donc, je veux supprimer les e-mails vides mais angular forEach
méthode enlever un seul objet qui est le dernier objet pourquoi???.
code js
angular.forEach($scope.emails, function(email, index){
if(email.value ===""){
$scope.emails.splice(index, 1);
}
});
où j'ai fais de mal
6 réponses
le problème est que vous retirez des éléments du tableau pendant la boucle de sorte que les éléments plus tard sont à des indices différents. Vous avez besoin de la boucle vers l'arrière à la place:
for (var i = $scope.emails.length - 1; i >= 0; i--) {
if (!$scope.emails[i].value) {
$scope.emails.splice(i, 1);
}
}
Voici un exemple mis à jour.
Comme d'autres l'ont souligné, le coupable du code est le tableau est supprimé. Pour contourner angulaire.forEach, vous pouvez essayer de l'additif/approche d'affectation:
var filteredEmails = [];
angular.forEach($scope.emails, function(email, index){
if(email.value !==""){
filteredEmails.push(email);
}
});
$scope.emails = filteredEmails;
indexOf
retourne -1
quand il ne trouve pas un article.
une façon de supprimer un article, et d'éviter d'enlever le dernier lorsqu'il n'est pas trouvé, est:
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);
}
});
}
});
Je n'ai pas essayé avec AngularJs, mais avec AngularJS 4 une façon similaire de cela fonctionne assez bien.
angular.forEach($scope.emails, function(email){
if(email.value ===""){
$scope.emails.splice($scope.emails.indexOf(email), 1);
}
});
Angulaire 4 version:
this.emailArray.forEach(email => {
if (email.value == "") {
this.emailArray.splice(this.emailArray.indexOf(email),1);
}
});
Selon docs, la fonction iterator permet un troisième paramètre qui est la collection qui est itérée. Épiler cette collection au lieu de $scope.emails
supprimera l'obejct attendu.
angular.forEach($scope.emails, function(email, index, obj){
if(email.value ===""){
obj.splice(index, 1);
}
});