【问题标题】:javascript foreach var weird ptrjavascript foreach var 奇怪的 ptr
【发布时间】:2017-02-13 13:22:18
【问题描述】:

我被javascript forEach func 卡住了。 下面是一段代码:

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":["a","b","c"]},{"azerty":1,"qwerty":["a","b"," c"]},{"azerty":2,"qwerty":["a","b","c"]},{"azerty":3,"qwerty":["a","b" ,"c"]}]

有人可以提出解决此问题的替代方法吗? 谢谢!

编辑 #1:通过手动复制分配修复。但由于未知原因不适用于 forEach 中的 forEach。

【问题讨论】:

  • 你应该解释你期望这段代码做什么以及会发生什么。
  • 解释一下如何?
  • 状态更新。解决方案不再适用于 forEach 中的 forEach。
  • 已解决,但仍然很奇怪.. 我不得不处理内部的 forEach。

标签: javascript jquery foreach scope


【解决方案1】:

p 对象在循环中具有相同的引用。你可以使用Object.assign创建一个基于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>

【讨论】:

  • 也是不错的选择。谢谢!
【解决方案2】:

您在循环中引用了同一个对象。您可以在回调中移动对象并为每个循环使用一个新对象。

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

【讨论】:

  • 谢谢!避免了很多痛苦。
【解决方案3】:

您应该将var p 定义为如下所示的空白对象::

var p = {};

您的其余代码应保持不变。就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2011-06-25
    • 2010-11-24
    • 1970-01-01
    相关资源
    最近更新 更多