鍍金池/ 問(wèn)答/HTML/ 這樣拷貝數(shù)組,有什么問(wèn)題,arr是要拷貝得數(shù)組?

這樣拷貝數(shù)組,有什么問(wèn)題,arr是要拷貝得數(shù)組?

const copyArr = function (arr) {
  const res = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr[i].children) {
      res[i] = { name: arr[i].name };
      for (let j = 0; j < arr[i].children.length; j++) {
        res[i].children[j] = [{
          name: arr[i].children[j].name,
        }];
      }
      copyArr(arr[i].children);
    } else {
      res[i] = { name: arr[i].name };
    }
  }
  return res;
};

報(bào)錯(cuò):Cannot set property '0' of undefined
數(shù)組結(jié)構(gòu)是這樣的:
op: [

    {
      name: '時(shí)間',
    },
    {
      name: '性別',
    },
    {
      name: '科室',

    },
    {
      name: '年齡',
    },
    {
      name: '轉(zhuǎn)歸',
    },
    {
      name: '專病',
      children: [{
        name: '并且',
        // label: {
        //   backgroundColor: 'rgb(38,253,203)',
        //   borderColor: 'rgb(97,161,138)',
        //   padding: [8, 2, 8, 2],
        //   borderRadius: 14,
        // },
        children: [
          { name: 'T1', value: 2105 },
          { name: 'N1', value: 1316 },
          { name: 'MO', value: 3151 },
        ],
      }],

    },
    {
      name: '主診斷',
    },
    {
      name: '手術(shù)',
    },
    {
      name: '抗癌藥物',
    },
    {
      name: '檢驗(yàn)指標(biāo)',
      children: [{
        name: '并且',
        // label: {
        //   backgroundColor: 'rgb(38,253,203)',
        //   borderColor: 'rgb(97,161,138)',
        //   padding: [8, 2, 8, 2],
        //   borderRadius: 14,
        // },
        children: [{
          name: '檢驗(yàn)指標(biāo)',
          children: [{
            name: '紅細(xì)胞計(jì)數(shù)',
            children: [
              { name: '1-5' },
            ],
          }, {
            name: '血球壓積',
            children: [
              { name: '1-5' },
            ],
          }, {
            name: '葡萄糖',
            children: [
              {
                name: '陰性',
                // label: {
                //   backgroundColor: 'rgb(29,204,34)',
                // },
              },
            ],
          }, {
            name: '乙肝抗原',
            children: [
              {
                name: '陰性',
                // label: {
                //   backgroundColor: 'rgb(29,204,34)',
                // },
              },
            ],
          },
          ],
        }],
      }],

    },
    {
      name: '自定義條件',
      children: [{
        name: '并且',
        // label: {
        //   backgroundColor: 'rgb(38,253,203)',
        //   borderColor: 'rgb(97,161,138)',
        //   padding: [8, 2, 8, 2],
        //   borderRadius: 14,
        // },
        children: [{
          name: '出院小結(jié)',
          children: [{
            name: '并含',
            // label: {
            //   backgroundColor: 'rgb(38,253,203)',
            //   borderColor: 'rgb(97,161,138)',
            //   padding: [8, 2, 8, 2],
            //   borderRadius: 14,
            // },
            children: [
              { name: '乳腺惡心腫瘤' },
              { name: '好轉(zhuǎn)' },
            ],
          }],
        }, {
          name: '入院診斷',
          children: [{
            name: '或含',
            // label: {
            //   backgroundColor: 'rgb(38,253,203)',
            //   borderColor: 'rgb(97,161,138)',
            //   padding: [8, 2, 8, 2],
            //   borderRadius: 14,
            // },
            children: [
              { name: '心率失常' },
              { name: '腦梗塞' },
            ],
          }],
        },
        ],
      }, {
        name: '或者',
        // label: {
        //   backgroundColor: 'rgb(38,253,203)',
        //   borderColor: 'rgb(97,161,138)',
        //   padding: [8, 2, 8, 2],
        //   borderRadius: 14,
        // },
        children: [{
          name: '病程記錄',
          children: [{
            name: '不含',
            // label: {
            //   backgroundColor: 'rgb(38,253,203)',
            //   borderColor: 'rgb(97,161,138)',
            //   padding: [8, 2, 8, 2],
            //   borderRadius: 14,
            // },
            children: [
              { name: '心率失常' },
              { name: '腦梗塞' },
            ],
          }],
        }, {
          name: '出院小結(jié)',
          children: [
            { name: '痊愈' },
          ],
        },
        ],
      }, {
        name: '不含',
        // label: {
        //   backgroundColor: 'rgb(38,253,203)',
        //   borderColor: 'rgb(97,161,138)',
        //   padding: [8, 2, 8, 2],
        //   borderRadius: 14,
        // },
        children: [
          { name: '手術(shù)記錄' },
          { name: '靶向治療' },
        ],
      },
      ],
    },
  ],
回答
編輯回答
毀憶

你可以對(duì)一個(gè)對(duì)象用res[i].children來(lái)指定他的屬性的值,但是不能用res[i].children[j]來(lái)指定一個(gè)不存在的數(shù)組的索引.



const copyArr = function (arr) {
  const res = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr[i].children) {
      res[i] = { name: arr[i].name ,children:[]}; //這里先定義children
      for (let j = 0; j < arr[i].children.length; j++) {
        res[i].children[j] = [{
          name: arr[i].children[j].name,
        }];
      }
      copyArr(arr[i].children);
    } else {
      res[i] = { name: arr[i].name };
    }
  }
  return res;
};

補(bǔ)充:如果需要正確遞歸處理的話,直接將children取為遞歸返回的數(shù)組即可

copyArr = function (arr) {
  let res = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr[i].children) {
      res[i] = { name: arr[i].name ,children:copyArr(arr[i].children)}; //這里先定義children
      
    } else {
      res[i] = { name: arr[i].name };
    }
  }
  return res;
};
2017年8月14日 15:26
編輯回答
怣痛

對(duì)于復(fù)雜數(shù)組或?qū)ο?,建議采用 序列化再反序列化的方式更加便捷和安全

const copyArr = function (arr) {
  return JSON.parse(JSON.stringify(arr));
};
2017年3月20日 07:54