2017-09-09 2 views
3

Cette fonction renvoie la même valeur dans la liste de tableaux.Pourquoi le tableau contient-il seulement la dernière valeur n fois?

Par exemple si i=10, mon tableau doit contenir 10 valeurs différentes, mais il ne stocke que la dernière valeur 10 fois.

Quel est le problème dans mon code?

$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; 
} 

Répondre

3

Cela se produit parce que vous utilisez pour $scopewId.ID en dehors de la boucle. Par conséquent, vos éléments de liste pointent vers le même objet.

Une fois que vous modifiez $scope.wId.ID, la liste $scope.webTempIds sera également mise à jour.

Pour corriger faire id locale:

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

Comme une note de côté: utiliser Scope pour lier contrôleur d'application et la vue. (à l'intérieur de la boucle for vous n'avez pas besoin de portée)

+0

** Maxim ** Merci! ça fonctionne bien maintenant. –

+0

@kashiviswanath vous accueillir à accepter. Merci –

3
$scope.wId={}; 

est modifié à chaque fois. Le tableau contient la référence à cet objet et par conséquent, lorsque vous modifiez la valeur, il modifie la valeur dans le tableau.

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

Comme d'autres l'ont correctement souligné, vous vous retrouvez avec le dernier élément du tableau parce que la valeur que vous appuyez sur le tableau est sur le $scope et sera remplacé par la nouvelle valeur à chaque fois.

Pour offrir une approche alternative, vous pouvez utiliser la fonction Array.prototype.map pour retourner un nouveau tableau prérempli avec seulement les valeurs de propriété id de chaque élément de données:

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

Ceci élimine le besoin pour toutes les boucles avec des variables temporaires et n'importe quel push pour construire manuellement un nouveau tableau à partir de zéro.