2017-09-09 7 views
3

この関数は、配列リストに同じ値を返します。配列に最後の値がn回だけ含まれているのはなぜですか?

たとえば、i=10の場合、配列には10個の異なる値が含まれていますが、最後の値は10回だけ格納されます。

私のコードの問題点は何ですか?

$scope.webTempIds=[]; 
$scope.wId={}; 
$scope.getIds=function(){ 
    for(var i=0;i<$rootScope.retData.length;i++){ 
    $scope.wId.ID=$rootScope.retData[i].WEBUI_TEMP_ID; 
    $scope.webTempIds.push($scope.wId); 
    } 
    return $scope.webTempIds; 
} 

答えて

3

あなたはループの外でwId.IDため$scopeを使用するためです。したがって、リストアイテムは同じオブジェクトを指しています。

$scope.wId.IDを変更すると、リスト$scope.webTempIdsも更新されます。

IDはローカルにそれを修正する:サイドノートとして

for(var i=0;i<$rootScope.retData.length;i++){ 
    var wId = { 
      ID: $rootScope.retData[i].WEBUI_TEMP_ID; 
      } 
    $scope.webTempIds.push(wId); 
} 

を:アプリケーション・コントローラとビューを結合するためにスコープを使用。 (forループ内にはスコープが必要ありません)

+0

**マキシム**ありがとうございました!今はうまくいきます。 –

+0

@kashiviswanathあなたが受け入れることを歓迎します。ありがとう –

3
$scope.wId={}; 

が毎回変更されています。配列にはこのオブジェクトへの参照が含まれているため、値を変更すると配列の値が変更されます。他の人が正しく指摘したように、あなたが配列にプッシュした値が$scopeにあり、と置き換えられますので

let obj = {}; 
 

 
let result = []; 
 
for(let i = 0; i<10; i++){ 
 
    obj.a = i; 
 
    result.push(obj); 
 
} 
 

 
console.log(result);

0
$scope.getIds=function(){ 
     $scope.webTempIds=[]; 
     for(var i=0;i<$rootScope.retData.length;i++){ 
      $scope.wId={}; 
      $scope.wId.ID =$rootScope.retData[i].WEBUI_TEMP_ID; 
      $scope.webTempIds.push($scope.wId); 
     } 
return $scope.webTempIds; 
    } 
1

は、あなたは配列の最後の項目で終わります毎回新しい値。

$scope.getIds=function(){ 
    $scope.webTempIds = $rootScope.retData.map(
    function(obj){ 
     return obj.id; 
    } 
); 
} 

これは一時的な変数を持つループの必要性を排除します。

は別のアプローチを提供するには、各データ項目のちょうどidプロパティ値が事前に入力新しい配列を返すようにArray.prototype.map機能を使用することができます手動で新しい配列を最初から構築することができます。

関連する問題