【问题标题】:cannot iterate through array and change value in JS无法遍历数组并更改 JS 中的值
【发布时间】:2014-12-13 10:20:27
【问题描述】:

我必须遍历一个数组,更改其中一个值,并创建另一个反映更改的数组。

这是我目前所拥有的:

JS:

var arr = new Array();

        arr['t1'] = "sdfsdf";
        arr['t2'] = "sdfsdf";
        arr['t3'] = "sdfsdf";
        arr['t4'] = "sdfsdf";
        arr['t5'] = "sdfsdf";

        var last = new Array();

        for (var i = 0; i <= 5; i++) {
            arr['t2'] = i;
            last.push(arr);
        }

        console.log(last);

不幸的是,这些是我的结果

如您所见,我得到的结果不是 0,1,2.. 而是 2,2,2.. 这就是我想要的结果:

我该如何解决这个问题?

【问题讨论】:

  • 如果您需要我详细解释,请告诉我
  • javascript 中的数组不使用文本索引(意味着没有关联数组)。您实际上在做的是向数组对象添加属性,而不是向数组添加元素。
  • 我明白了。您将如何修复或重做此代码?
  • 能否请您提供一个显示代码的答案,以便我试一试?
  • 使用对象{}而不是数组[]

标签: javascript arrays iteration


【解决方案1】:

您必须进行复制,否则您一直在处理对同一对象的引用。正如之前所说 - javascript 没有关联数组,只有具有属性的对象。

var arr = {}; // empty object

arr['t1'] = "sdfsdf";
arr['t2'] = "sdfsdf";
arr['t3'] = "sdfsdf";
arr['t4'] = "sdfsdf";
arr['t5'] = "sdfsdf";

var last = new Array();

for (var i = 0; i <= 5; i++) {
   var copy = JSON.parse(JSON.stringify(arr)); //create a copy, one of the ways
   copy['t2'] = i;  // set value of its element
   last.push(copy); // push copy into last
}

console.log(last);

ps:您可以使用点符号arr.t1 代替arr['t1']

【讨论】:

  • 终于有人在这里帮助我而不是批评。我会给你的答案一个镜头。谢谢。
  • 我试过你回答但结果丢失了 t1,t3,t4,t5 中的信息。
  • @DiegoCamacho 修复了它
【解决方案2】:

使用 ['t2'] 的数组访问不是问题。这是一个常规的 JavaScript 功能。

问题是:您将 SAME 数组添加到“last”(代码中为 5 次,屏幕截图中为 3 次)。 每次设置 ['t2'] = i 时,都会更改“last”中的值,因为它们实际上只是对同一个数组实例的引用。

在将其添加到“last”之前,您必须创建数组的副本/克隆。

这在数组是对象引用的所有语言中都会发生(Java、C#...)。不过,它可以与 C++ STL 一起使用。

【讨论】:

  • 感谢您的回答。我通常是一名 PHP 程序员,这可能是我遇到这个问题的原因。我会考虑你的建议。
猜你喜欢
  • 2019-07-25
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 2016-10-11
  • 2022-01-07
  • 2020-10-11
相关资源
最近更新 更多