这样拷贝数组,有什么问题,arr是要拷贝得数组?

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;
};

报错:Cannot set property '0' of undefined
数组结构是这样的:
op: [

    {
      name: '时间',
    },
    {
      name: '性别',
    },
    {
      name: '科室',

    },
    {
      name: '年龄',
    },
    {
      name: '转归',
    },
    {
      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: '手术',
    },
    {
      name: '抗癌药物',
    },
    {
      name: '检验指标',
      children: [{
        name: '并且',
        // label: {
        //   backgroundColor: 'rgb(38,253,203)',
        //   borderColor: 'rgb(97,161,138)',
        //   padding: [8, 2, 8, 2],
        //   borderRadius: 14,
        // },
        children: [{
          name: '检验指标',
          children: [{
            name: '红细胞计数',
            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: '出院小结',
          children: [{
            name: '并含',
            // label: {
            //   backgroundColor: 'rgb(38,253,203)',
            //   borderColor: 'rgb(97,161,138)',
            //   padding: [8, 2, 8, 2],
            //   borderRadius: 14,
            // },
            children: [
              { name: '乳腺恶心肿瘤' },
              { name: '好转' },
            ],
          }],
        }, {
          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: '出院小结',
          children: [
            { name: '痊愈' },
          ],
        },
        ],
      }, {
        name: '不含',
        // label: {
        //   backgroundColor: 'rgb(38,253,203)',
        //   borderColor: 'rgb(97,161,138)',
        //   padding: [8, 2, 8, 2],
        //   borderRadius: 14,
        // },
        children: [
          { name: '手术记录' },
          { name: '靶向治疗' },
        ],
      },
      ],
    },
  ],
阅读 1.9k
2 个回答

你可以对一个对象用res[i].children来指定他的属性的值,但是不能用res[i].children[j]来指定一个不存在的数组的索引.



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;
};

补充:如果需要正确递归处理的话,直接将children取为递归返回的数组即可

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;
};

对于复杂数组或对象,建议采用 序列化再反序列化的方式更加便捷和安全

const copyArr = function (arr) {
  return JSON.parse(JSON.stringify(arr));
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题