2017-02-13 32 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 = {}; 

休息你的代码应该保持相同。而已。