私はこのような配列を持っています:
$scope.emails = [
{"key":"Work","value":"[email protected]"},
{"key":"","value":""},
{"key":"Work","value":"[email protected]"}
{"key":"","value":""}];
だから、空のメールを削除したいのですが、angular forEach
メソッドは、最後のオブジェクトである1つのオブジェクトのみを削除する理由はなぜですか????。
jsコード
angular.forEach($scope.emails, function(email, index){
if(email.value ===""){
$scope.emails.splice(index, 1);
}
});
私が間違っているところ
問題は、ループ中に配列から要素を削除して、後の項目が異なるインデックスにあることです。代わりに逆方向にループする必要があります。
for (var i = $scope.emails.length - 1; i >= 0; i--) {
if (!$scope.emails[i].value) {
$scope.emails.splice(i, 1);
}
}
更新された例 です。
他の人が指摘したように、コードの犯人は配列が削除されたことです。 angular.forEachを回避するには、加算/割り当てのアプローチを試すことができます。
var filteredEmails = [];
angular.forEach($scope.emails, function(email, index){
if(email.value !==""){
filteredEmails.Push(email);
}
});
$scope.emails = filteredEmails;
indexOf
は、アイテムが見つからないときに-1
を返します。
アイテムを削除し、見つからない場合に最後のアイテムが削除されないようにする方法は次のとおりです。
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);
}
});
}
});
私はAngularJsでこれを試したことはありませんが、Angular 4でこれと同様の方法でかなりうまくいきます。
angular.forEach($scope.emails, function(email){
if(email.value ===""){
$scope.emails.splice($scope.emails.indexOf(email), 1);
}
});
Angular 4バージョン:
this.emailArray.forEach(email => {
if (email.value == "") {
this.emailArray.splice(this.emailArray.indexOf(email),1);
}
});