错误代码:

image.png

需求背景:

new了一个数组bgarr 默认填充的是 { isActive: false } ;
然后 当前数组的索引 如果和另外一个数组IntFram中的值相同 就修改当前元素 的isActive属性的值为true

报错描述:

执行上图中的方法后,结果会把 bgarr 的所有元素的 isActive 的值都改成了true 。

报错原因:

Array.fill() 方法 中只接受常量 不能接受对象类型的数据。
一旦填充的是对象{isActive:false} 那么bgarr数组中的每个元素中的对象指向的都是堆内存中同一个地址,所以改变数组中任何一个元素 的属性值 ,所有的属性值都会被改变。

解决方案:

先创建固定长度的数组;
再单独创建对象 ,
通过map返回给数组中的每个元素。
实现每个元素中的对象都是相互独立的。

  1. const creatBgArr = (numImageFrames, frameIndex) => {
  2. let bgarr = new Array(numImageFrames[0][0])
  3. .fill(1)
  4. .map(() => ({ isActive: false }));
  5. const IntFram = frameIndex[0].map(frame => Math.round(frame));
  6. const bgarrKeys = bgarr.keys();
  7. for (const key of bgarrKeys) {
  8. for (const value of IntFram) {
  9. if (key === value) {
  10. bgarr[value].isActive = true;
  11. }
  12. }
  13. }
  14. console.log(`IntFram`, IntFram);
  15. console.log(`bgarr`, bgarr);
  16. return bgarr;
  17. };

结果如下就正常啦~
image.png