2017-02-13 63 views
0

我被JavaScript forEach func卡住了。 這裏的一些代碼段:JavaScript foreach var怪異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>

預期: 決賽:0,1,2,3, 決賽:[{ 「AZERTY」:0, 「QWERTY」:[」一」, 「b」, 「C」]},{ 「AZERTY」:1, 「QWERTY」:[ 「一」, 「b」, 「C」]},{ 「AZERTY」:2, 「QWERTY」: [「a」,「b」,「c」]},{「azerty」:3,「qwerty」:[「a」,「b」,「c」]}]

任何人都可以提出替代方案解決這個問題? 謝謝!

編輯#1:固定與手動複製分配。但對於forEach而言,forEach並不適用,原因不明。

+0

你應該解釋一下你期望這段代碼做什麼以及發生了什麼。 – str

+0

如何解釋? – DanielPanic

+0

狀態更新。 forEach中的forEach解決方案無法工作。 – Ousret

回答

0

的p對象具有環路內相同的附圖。您可以使用Object.assignPPPP

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

太好了。謝謝! – Ousret

0

您正在引用循環中的同一個對象。您可以在回調中移動對象,併爲每個循環使用一個新對象。

$(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

謝謝!避免了很多痛苦。 – Ousret

0

創建基於一個新的對象你shold定義像下面var p爲空白對象::

var p = {}; 

休息你的代碼應該保持相同。而已。