Javascript 前角和拼接

Javascript 前角和拼接,javascript,angularjs,array-splice,Javascript,Angularjs,Array Splice,我有这样一个数组: $scope.emails = [ {"key":"Work","value":"user@domine.com"}, {"key":"","value":""}, {"key":"Work","value":"user2@domine.com"} {"key":"","value":""}]; 所以,我想删除空电子邮件,但angularforEach方法只删除最后一个对象,为什么 js代码 angular.forEach($scope.emails, f

我有这样一个数组:

$scope.emails = [
  {"key":"Work","value":"user@domine.com"},
  {"key":"","value":""},
   {"key":"Work","value":"user2@domine.com"}
  {"key":"","value":""}];
所以,我想删除空电子邮件,但angular
forEach
方法只删除最后一个对象,为什么

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);
    }
}
下面是一个。

根据,迭代器函数允许第三个参数,即正在迭代的集合。拼接该集合而不是
$scope.emails
将删除预期的obejct

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

正如其他人指出的那样,代码的罪魁祸首是数组被删除。要使用angular.forEach,可以尝试加法/赋值方法:

var filteredEmails=[];
angular.forEach($scope.email,函数(email,索引){
如果(email.value!==“”){
filteredEmails.push(电子邮件);
}
});
$scope.emails=filteredEmails;

indexOf
在找不到项目时返回
-1

删除项目并避免在找不到项目时删除最后一个项目的方法是:

var index = $scope.items.indexOf($scope.oldItem);

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

我没有在AngularJs上尝试过,但在Angular4上,类似的方法效果很好

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

});
角度4版本:

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

请在您的问题中包含相关代码,而不仅仅是链接到JSBin。
splice
的第二个参数指示必须删除多少元素,因此,如果您以前可以确定,您也可以在一个
splice
中执行此操作。例如,您可以使用
$scope.emails.splice(1,2)
(或
$scope.emails.splice(1)
,删除阵列中最后两封电子邮件,这将删除第一个元素之后的所有内容)。@James Allardice感谢您的重播。很好用。但我的问题是我们不能用forEach@chandu-否,
forEach
以错误的方向在数组上迭代,因此必须使用普通循环。@link-只有当所讨论的元素在数组中彼此相邻时,这才起作用。当然,这就是为什么我加上了“如果你能在之前确定的话”:)OP的问题不太清楚,所以我想在他的情况允许的情况下加上它作为备注。我不是要删除空值而不是第二个索引元素吗?你的意思是要删除空元素吗?
this.emailArray.forEach(email => {
  if (email.value == "") {
    this.emailArray.splice(this.emailArray.indexOf(email),1);
  }
});