添加到数组时,新对象会被覆盖

时间:2015-08-28 06:30:11

标签: javascript arrays object

新手在这里......很好。

我有一个空对象,会被推入数组。

imageLoader.displayImage(imageUri, imageView);

我添加属性。

<MapControl> ... </MapControl>

我将结果对象推送到数组中。

listView = {};

每次在步骤#2中输入新选择时,它都会覆盖对象,而不是将新对象属性添加到数组中。它还将索引递增1,所以它只重复......

listView.code = code;
listView.description = description;

数组应包含三个不同的对象。但相反,它有三个新添加的副本......

我应该如何添加新的选择对象,以免被覆盖?

4 个答案:

答案 0 :(得分:1)

您总是添加对同一对象的引用,并更改同一个对象,而不是添加新对象。见:

var a = [];
var o = {};
for (var i = 0; i < 5; i++) {
  o.id = i;
  a.push(o);
}
a
// => [{"id":4},{"id":4},{"id":4},{"id":4},{"id":4}]

但是

var a = [];
for (var i = 0; i < 5; i++) {
  var o = {};
  o.id = i;
  a.push(o);
}
a
// => [{"id":0},{"id":1},{"id":2},{"id":3},{"id":4}]

不同的是,第二个代码总是创建一个与数组中已有的所有其他对象不同的新对象。

作为一个比喻,想象一下戏剧导演。他转向演员,说:“你......你将成为罗密欧。”然后他看着相同的演员说:“你......你将成为Mercutio。在这里,Mercutio,拿走这把剑.Romeo ......谁告诉你拿剑?!?”完全没有意识到,如果罗密欧和Mercutio是同一个人,如果其中一个人拿起剑,另一个人也会这样做。

答案 1 :(得分:0)

试试这个:

listy.push({
    code:listView.code,
    description : listView.description
})

在我的代码中,我使用了pass by value。

在您的代码中,您使用的是通过引用传递的对象。

您一次又一次地添加相同的引用,所以最后您将获得一个包含相同对象的所有值的数组。

要了解有关按值传递的更多信息并按引用传递,您可以访问以下链接:

  

Pass Variables by Reference in Javascript

答案 2 :(得分:0)

看到你宣称自己是一个新手&#39;我想我会花更多时间解释一下。将对象推送到数组时,不要复制该对象。您只需告诉数组在哪里找到对象(引用)。如果将同一对象推送3次,则该数组只有3个索引,在该索引处找到相同的对象。有几种解决方法,最简单的方法是在循环中声明变量

for (var i=0;i<3;i++){
    var listView = {};
    listView.id = i;
    listy.push(listView);
}

这样,listView每次都是不同的引用。另一种方法是在推送

时创建一个新对象
listy.push({id:listView.id, description:listView.description});

这是有效的,因为简单的变量被复制&#39;进入数组而没有引用。

答案 3 :(得分:0)

您对对象属性的分配只是替换现有属性。当您按名称推送数组中的对象时,您将推送对象的引用而不是值。这就是为什么数组中的所有元素都相同的原因。每次推动都需要创建一个新对象。这样的事情对你有用。

     <route id="main-route">
        <split streaming="true" strategyRef="aggregationStrategy">
            <ref>zipSplitter</ref>
            <choice>
                <when>
                    <method bean="fileHandler" method="isY" />
                    <to uri="direct:y" />
                </when>
                <otherwise>
                    <to uri="direct:x" />
                </otherwise>
            </choice>               
       </split>
  </route>