2017-02-13 1 views
0

Je suis coincé avec javascript forEach func. est ici un morceau de code:javascript foreach var bizarre ptr

const PPPP = 
 
    { 
 
     'azerty': 0, 
 
     'qwerty': [] 
 
    }; 
 

 
    $(document).ready(function() { 
 
     var k = []; 
 
     var z = [0, 1, 2, 3]; 
 
     
 
     var m = ['a', 'b', 'c']; 
 
     
 
     z.forEach(function(v) { 
 
     
 
     var p = Object.assign({}, PPPP); 
 
     
 
     $('#debug').append(v.toString()+', '); 
 
     p.azerty = v; 
 
     
 
     m.forEach(function(v) { 
 
      
 
      p.qwerty.push(v); 
 
      
 
     }); 
 
     
 
     k.push(p); 
 
     
 
     }); 
 
     
 
     $('#res').html('Final: '+JSON.stringify(k)); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
    <div id="debug"></div> 
 
    <div id="res"></div>

attendu: final: 0, 1, 2, 3, final: [{ "azerty": 0, "azerty": [ » a "," b "," c "]}, {" azerty ": 1," qwerty ": [" a "," b "," c "]}, {" azerty ": 2," qwerty ": ["a", "b", "c"]}, {"azerty": 3, "qwerty": ["a", "b", "c"]}]

Quelqu'un peut-il proposer une alternative? réparer ça? Merci!

Édition 1: Fixe avec affectation manuelle des copies. Mais ne fonctionne pas avec forEach in forEach pour une raison inconnue.

+0

Vous devriez expliquer ce que vous attendez de ce code et ce qui se passe à la place. – str

+0

Que diriez-vous d'expliquer? – DanielPanic

+0

Mise à jour du statut. La solution ne fonctionne plus avec forEach in forEach. – Ousret

Répondre

0

L'objet p a la même référence dans la boucle. Vous pouvez utiliser Object.assign pour créer un nouvel objet basé sur PPPP

const PPPP = 
 
{ 
 
    'azerty': 0 
 
}; 
 

 
$(document).ready(function() { 
 
    var k = []; 
 
    var z = [0, 1, 2, 3]; 
 
    
 
    z.forEach(function(v) { 
 
    
 
    var p = Object.assign({},PPPP); 
 
    
 
    $('#debug').append(v.toString()+', '); 
 
    p.azerty = v; 
 
    k.push(p); 
 
    
 
    }); 
 
    
 
    $('#res').html('Final: '+JSON.stringify(k)); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="debug"></div> 
 
<div id="res"></div>

+0

Bonne alternative aussi. Remercier! – Ousret

0

Vous référencez le même objet dans la boucle. Vous pouvez déplacer l'objet à l'intérieur du rappel et utiliser un nouvel objet pour chaque boucle.

$(document).ready(function() { 
 
    var k = []; 
 
    var z = [0, 1, 2, 3]; 
 
    
 
    z.forEach(function(v) { 
 
    const PPPP = { 'azerty': 0 }; // move to this place 
 
    
 
    var p = PPPP; 
 
    
 
    $('#debug').append(v.toString()+', '); 
 
    p.azerty = v; 
 
    k.push(p); 
 
    
 
    }); 
 
    
 
    $('#res').html('Final: '+JSON.stringify(k)); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="debug"></div> 
 
<div id="res"></div>

+0

Merci! Beaucoup de douleur évitée. – Ousret

0

Vous définissez shold var p comme objet vide comme ci-dessous ::

var p = {}; 

reste de votre code devrait rester même . C'est tout.