美文网首页
循环给数组里的对象赋值

循环给数组里的对象赋值

作者: 詹小云 | 来源:发表于2017-06-07 21:39 被阅读0次

这个题目听起来有点别扭,但是其实也挺常见的。最实在的一个场景就是,你构建了一个数组,数组元素是对象,但是这些对象的结构体都是一样的,唯一不一样的就是每个键的值。要是觉得乱,请看小栗子:

var a = [{c: ' ',d: ' '},{c: ' ', d: ' ' }, {c: ' ' ,d: ' ' }];

一看到这个首先想到的肯定是for循环了,好的,没错,本文也是采用这种思路。顺着思路往下写就是这样的

//设定数组长度
var len = 9;
//设定结构体
var a = {
    c: ' ',
    d:' '
};
var b = new Array();
for(var i = 0; i < len; i++) {
    a.c = i;
    a.d = i+1;
//将对象循环放进数组中
    b.push(a);
    console.log(b[i].c);
}
console.log(b[3].c);
console.log(b[4].c);

嘻嘻,猜猜这三个log里边的数据。
不卖关子地说答案如下:
0-8
8
8
第一次看到这个结果的,我怎么也想不明白,为什么循环体内外的数据是不一样。这样的话,根本无法完成循环给数组内的对象赋值的任务了。后来查了很多东西,才看清了本质:对象的深复制与浅复制。因为对象a是预先定义好的,循环push进数组b的都是同一个对象a,所以当for循环里重新赋值的时候,每一个对象a都会变成一样的值。
其实在此之前,我是知道深复制和浅复制的,但是我根本没往这方面去注意,大概还是资质过浅,无法一眼识别。
关于深浅赋值,网上有很多的相关内容,在此贴出我认为好理解的概念。

浅复制:复制了对象的地址,只要改变其中一个,其他的都会被改变
深复制:复制了整个对象,不会彼此牵连

找出原因之后,就很容易对症下药了。

var len = 9;
var a = {
   c: ' '
};
var b = new Array();
for(var i = 0; i < len; i++) {
   var a = {
       c: ' ',
       d:' '
       };
   a.c = i;
   a.d = i+1;
   b.push(a);
   console.log(b[i].c); //0-8
}
console.log(b[3].c);//3
console.log(b[4].c);//4

也许还有其他方法,但总归是一个道理,破除了浅复制,你就赢了。

相关文章

  • 循环给数组里的对象赋值

    这个题目听起来有点别扭,但是其实也挺常见的。最实在的一个场景就是,你构建了一个数组,数组元素是对象,但是这些对象的...

  • 自定义对象的实现copy方法

    对自定义的对象进行copy方法,会报错,没有实现copy方法 从数组里面取出来的对象,赋值给另外一个变量,然后对这...

  • 批量读入/读出数据

    批量读入数据 assign函数在循环时候,给变量赋值,算是比较方便1、给变量赋值 2、通过for循环给变量a1、a...

  • ES6

    let const 数组的解构赋值 ---扩展 for - of循环 Promise对象 Generator函数

  • ★13.关于std--function

    给std::function对象赋值 可以给std::function对象赋值任何类型的对象,但是在模板实例化阶段...

  • 第二章:创建数据集_《R语言实战》笔记

    对象:指可以赋值给变量的任何事物(常量、函数、图形等) 模式(数据类型):对象的模式描述了此对象是如何存储的——数...

  • copy 和 retain(strong) 的区别

    首先声明 对NSMutableString的对象赋值 理解 把NSMutableString对象mStr分别赋值给...

  • 控制台错误信息:无法加载任何OC类信息

    错误信息 : 可能原因: 懒加载中是否使用了self., 若用 self.会造成死循环 对象尚未生成,就给对象的属性赋值

  • 变量的解构赋值

    数组的解构赋值 对象的解构赋值 字符串的解构赋值 数值和布尔值的解构赋值 函数参数的解构赋值 圆括号问题 用途 数...

  • 2.3 KVC设计模式(给对象的属性赋值)

    KVC设计模式(给对象的属性赋值) dog类 App类 Person类 KVC设计模式(给对象的属性赋值.png

网友评论

      本文标题:循环给数组里的对象赋值

      本文链接:https://www.haomeiwen.com/subject/utbafxtx.html