2016-05-18 3 views
1

私はバックエンドAPIによって返されたJSONデータのセットを持っており、既存の配列をループしてindexspliceで使用する必要があります。したがって、indexOfメソッドをフィルタ関数角度から。Angularjsはフィルタを介してindexOfを取得します

既存の配列からデータをフィルタリングすることはできますが、配列のインデックスを取得できませんでした。これは-1を返しました。

これはそれを行う方法です。

JS

angular.forEach($scope.data, function(){ 
    var index = $scope.Tablelist.indexOf($filter('filter')($scope.Tablelist,{id: $scope.data.id},true)); 
    console.log($filter('filter')($scope.Tablelist,{id: $scope.data.id},true)); 
    console.log(index); 
}) 

答えて

3

$filterは、配列を返しますそこから最初の要素を取得し、次にindexOfで検索する必要があります。

var index = $scope.Tablelist.indexOf(
       $filter('filter')($scope.Tablelist,{id: $scope.data.id},true)[0] 
      ); 

しかし、私はただArray.prototype.findIndex()を使用します。それは、それが必要以上に繰り返すことはないので、はるかに高速になります。

var index = $scope.Tablelist.findIndex(function(item) { 
    return item.id === $scope.data.id; 
}); 

または正規forループあなたは、より良いブラウザの互換性かどう:あなたはfindIndex代わりのフィルタを使用する理由を説明する

var index = -1; 
for (var i = 0; i < $scope.Tablelist.length; i++) 
    if ($scope.Tablelist[i].id === $scope.data.id) { 
     index = i; 
     break; 
    } 
} 
+0

ケアを? –

+1

速度については。 'filter'メソッドを使うと' Tablelist'を2回繰り返します。 'filter'で正しい項目を探し、' indexOf'でもう一度探します。 'findIndex'では一度だけ反復します。最初のマッチが見つかるまでは、それだけになります。 – 4castle

+0

いいえ、私は方法で行く、ずっとあなたにありがとう –

2

は、これを試してください:

var object = $filter('filter')($scope.Tablelist, function (d) { 
    return d.id === $scope.data.id; 
})[0] 
console.log(object); 
console.log($scope.Tablelist.indexOf(object); 
1
$filter('filter')($scope.Tablelist,{id: $scope.data.id},true) 

は長さ1の配列ではなく、アイテム自体を返します。

$filter('filter')($scope.Tablelist,{id: $scope.data.id},true)[0] 

1

$filterは、配列を返すトリックを行うことができ、あなたは-1を返し、あなたのTablelistでその配列のインデックスを見つけようとしている、してみてください:

var index = 
    $scope.Tablelist.indexOf($filter('filter')($scope.Tablelist,{id: $scope.data.id},true)[0])); 
関連する問題