开发者问题收集

React TypeError:无法读取未定义的属性‘0’

2021-08-27
89

我正在编写一个函数来计算 12 行的各列总数,并创建一个大小相同的总值的新数组,但我一直收到错误

TypeError:无法读取未定义的属性“0” 我该如何解决它

维度 [6][12] 的 new_matrix 是预先计算的,然后传递到 colTotaler 函数中,因为 矩阵输入也是通过矩阵输入形式获得的

colToataler(new_matrix);

let columns = [0,0,0,0,0,0,0,0,0,0,0,0];

const[col,setCol] = useState(columns);

const colTotaler = (new_matrix) => {
   let i = 0,
     j = 0;

   for (i = 0; i < new_matrix[0].length; i++) {
     for (j = 0; j < new_matrix.length; j++) {
       columns[i] += new_matrix[i][j];
     }
   }

   setCol(columns);
 };
2个回答

您选择计算 colTotaler 的方式不够好。我建议您以功能性方式执行此操作,使用 map reduce 和 React 的反应性:

const [matrix, setMatrix] = useState(defaultMatrix)

const colTotaler = matrix.map((column) => {
  return column.reduce((colTotal, element) => colTotal+ element, 0)
})

现在,每次调用 setMatrix 时,组件都会重新渲染,colTotaler 也会重新计算。

Mike Kokadii
2021-08-27

如果您从状态传递 new_matrix ,则状态的初始值可能未定义。要解决该问题,您可以添加 if 语句来检查状态是否已初始化:

let comumns = [0,0,0,0,0,0,0,0,0,0,0,0];

const[col,setCol] = useState(columns);

const colTotaler = (new_matrix) => {
   if (new_matrix) {
     let i = 0,
       j = 0;

     for (i = 0; i < new_matrix[0].length; i++) {
       for (j = 0; j < new_matrix.length; j++) {
         columns[i] += new_matrix[i][j];
       }
     }

     setCol(columns);
   }
 };
Eugene
2021-08-27