2014-10-20 34 views
5

所以我有我的角度控制器中的對象數組,我想返回數組中具有匹配ID的字段的索引值到我的參數。陣列中只有一個對象與fieldId匹配。從過濾器方法返回索引值javascript

$scope.indexOfField = function(fieldId) { 
     return $scope.model.fieldData.filter(function(x) { 
      if (x.Id === fieldId) { 
       return // ??????? 
      } 
     }); 
    } 

回答

5

不能從過濾方法返回指數。

The filter() method creates a new array with all elements that pass the test implemented by the provided function.

可以使用forEach

的過濾器()方法創建與通過由提供的功能實現的測試中所有元素的數組。

$scope.indexOfField = function(fieldId) { 
     var i; 
     return $scope.model.fieldData.forEach(function(x, index) { 
      if (x.Id === fieldId) { 
       i = index; 
      } 
     }); 
     // use i 
    } 

甚至更​​好的使用for當你發現你的ID,你不能停止的forEach。

$scope.indexOfField = function(fieldId) { 
     var fieldData = $scope.model.fieldData, 
      i = 0, ii = $scope.model.fieldData.length; 
     for(i; i < ii; i++) if(fieldData[i].Id === fieldId) break; 
     // use i 
    } 
+1

這將遍歷每個元素,而不是在找到正確的元素後停止。 – Jivings 2014-10-20 15:00:27

+0

謝謝。對for循環做了一些更改,它做我想要的 – alsco77 2014-10-20 15:07:51

+0

在遍歷整個數組並且找不到所查找的對象的情況下,「i」可能不是所需的索引 – elachell 2017-06-01 11:10:18

4

回調函數的第二個參數是索引。我不能完全明白你想讓你的函數做什麼/返回,但是如果在function(x之後加上, index,那麼你就可以訪問該迭代的索引。

從功能的工作,我不認爲你想filter都:

$scope.indexOfField = function(fieldId) { 
    var result = -1; 
    $scope.model.fieldData.some(function(x, index) { 
     if (x.Id === fieldId) { 
      result = index; 
      return true; 
     } 
    }); 
    return result; 
} 

Array#some停止作爲一個返回值truthy第一次迭代的,所以我們會停止第一次搜索匹配時搜索。

+0

結果在這個例子中不可用 – alsco77 2014-10-20 14:57:45

+0

@AlexScott:你是什麼意思「無法訪問」?回調函數是一個閉包,閉包可以訪問'result'變量。 – 2014-10-20 15:00:26

+0

@Jivings:不,這就是爲什麼我在示例中使用'some'的原因 - 所以我們一找到匹配就停下來。 – 2014-10-20 15:08:39

4

Array.prototype.filter文檔:

回調調用與三個參數:

  • 元件
  • Array對象正被遍歷
  • 的元素的索引值

然而,你或許應該使用的some功能如果陣列中只有一個實例使用indexOf(因爲它會盡快找到的第一次出現停止),然後找到索引:

var field = $scope.model.fieldData.filter(function(x) { 
    return x.Id === fieldId; 
})[0]; 
var index = $scope.model.fieldData.indexOf(field); 

或者遍歷數組,直到找到正確的元素:

var index; 
$scope.model.fieldData.some(function(x, i) { 
    if (x.Id === fieldId) return (index = i); 
}); 
-1

過濾器不會返回索引,但你可以做這樣的事情。

$scope.indexOfField = function(fieldId) { 
    $scope.model.fieldData.filter(function(x, i) { 
     if (x.Id === fieldId) { 
      var indexOfField = i; 
     } 
    }); 
    return indexOfField; 
};