在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ foreach循環(huán)為什么會(huì)影響整個(gè)大數(shù)組?

foreach循環(huán)為什么會(huì)影響整個(gè)大數(shù)組?

clipboard.png
totaltab 是一個(gè)大數(shù)組,大數(shù)組里有很多個(gè)二維數(shù)組。targetName是動(dòng)態(tài)的索引值,需要遍歷大樹組中某一項(xiàng)totaltab[targetName].contactdata讓這一項(xiàng)的數(shù)據(jù)發(fā)生改變,但是結(jié)局是整個(gè)totaltab每一項(xiàng)中的state都改變了,請(qǐng)問這是為什么,明明只是遍歷了某一項(xiàng)
打印total,是這樣的結(jié)構(gòu)
clipboard.png

每次只會(huì)便利大數(shù)組的一個(gè)大對(duì)象里的二維數(shù)組,如下:

clipboard.png
比如取totaltab[0].contactdata ==1,那么totaltab里的第一個(gè)大對(duì)象的二維數(shù)組會(huì)變成1,也不會(huì)影響整個(gè)totaltab,但是foreach就會(huì)

回答
編輯回答
離人歸

說明你的totaltab里的每一個(gè)元素的每一個(gè)元素實(shí)際上是同一個(gè)元素,比如

let obj = { a: 1 };
let arr = [obj, obj, obj];
arr.forEach(v => console.log(v));
arr[0].a = 2;
arr.forEach(v => console.log(v));

如果你說執(zhí)行totaltab[0].contactdata = 1只會(huì)讓totaltab[0].contactdata變成1而不會(huì)讓totaltab[1].contactdata也變成1,那只能說明totaltab[0] != totaltab[1],而不能說明totaltab[0].contactdata[i][j] != totaltab[k].contactdata[m][n],你執(zhí)行這段代碼驗(yàn)證一下:

console.log(totaltab[0].contactdata[0][0] == totaltab[0].contactdata[0][1]);
console.log(totaltab[0].contactdata[0][0] == totaltab[1].contactdata[0][0]);

以后要把你的代碼文本貼出來,不要只貼截圖,這樣別人才能把你的代碼復(fù)制出來測(cè)試

我自己寫了一段測(cè)試代碼:

let totaltab = [
  {
    Extra: null,
    contactdata: [
      [
        {
          state: 2
        },
        {
          state: -1
        },
        {
          state: -2
        },
        {
          state: 1
        }
      ],
      [
        {
          state: -5
        },
        {
          state: 2
        },
        {
          state: -4
        },
        {
          state: 0
        }
      ]
    ]
  },
  {
    Extra: null,
    contactdata: [
      [
        {
          state: -2
        },
        {
          state: -1
        },
        {
          state: -2
        },
        {
          state: 1
        }
      ],
      [
        {
          state: 3
        },
        {
          state: -2
        },
        {
          state: 1
        },
        {
          state: 0
        }
      ]
    ]
  }
];

let tabtarget = totaltab[0].contactdata;
tabtarget.forEach(item => {
  item.forEach(items => {
    items.state = items.state >= 1 ? 0 : items.state;
  });
});

console.log(JSON.stringify(totaltab, ' ', 2));

結(jié)果自己看,沒有任何問題。

但如果你的每個(gè)items實(shí)際上都相等的話,就會(huì)出現(xiàn)你說的情況:

let item = { state: 2 };
let totaltab = [
  {
    Extra: null,
    contactdata: [
      [ item, item, item, item ],
      [ item, item, item, item ],
    ]
  },
  {
    Extra: null,
    contactdata: [
      [ item, item, item, item ],
      [ item, item, item, item ],
    ]
  }
];

let tabtarget = totaltab[0].contactdata;
tabtarget.forEach(item => {
  item.forEach(items => {
    items.state = items.state >= 1 ? 0 : items.state;
  });
});

console.log(JSON.stringify(totaltab, ' ', 2));

另外你可能注意到了,我寫的后面的那段遍歷的代碼和你的不太一樣,但我的代碼和你的是等效的,你的會(huì)更繞一點(diǎn)。而且js里的變量什么的一般用小駝峰命名,推薦使用totalTabtabTarget而不是totaltabtabtarget,短標(biāo)識(shí)符你連著全小寫沒關(guān)系,長(zhǎng)了就很難看了。而且你兩層遍歷的變量名看起來也不太符合邏輯,item是個(gè)數(shù)組,而它的元素叫items,看著很難受。

2017年12月19日 05:36