为什么不能将数据推送到阵列上?

时间:2019-06-24 06:03:07

标签: javascript arrays for-loop

您能告诉我为什么此代码会产生错误吗? 我想创建一个多维数组

const segments = ['avgekcr', 'efgghe', 'ewlskffd'];
console.log(segments)
let cols = [];
let currSegment, currLetter;

for (let i = 0; i < segments.length; i += 1) cols.push([]);

console.log(cols[2])
//cols.push([])
console.log(cols.length + ' :L')

for (let j = 0; j < segments.length; j += 1) {
  currSegment = segments[j];
  for (let k = 0; k < currSegment.length; k += 1) {
    currLetter = currSegment[k]
    cols[k].push(currLetter);

  }
}

错误:

  

未捕获的TypeError:无法读取未定义的属性“ push”

7 个答案:

答案 0 :(得分:1)

您输入的索引错误,已更正代码。

const segments = ['avgekcr', 'efgghe', 'ewlskffd'];
console.log(segments)
let cols = [];
let currSegment, currLetter;

for (let i = 0; i < segments.length; i += 1) cols.push([]);

console.log(cols[2])
//cols.push([])
console.log(cols.length + ' :L')

for (let j = 0; j < segments.length; j += 1) {
  currSegment = segments[j];
  for (let k = 0; k < currSegment.length; k += 1) {
    currLetter = currSegment[k]
    cols[j].push(currLetter);

  }
}

console.log(cols)

答案 1 :(得分:0)

在第三次迭代后使用k的值,您试图将项目推入实际上不存在的 index 中。

更改

cols[k].push(currLetter);

收件人

cols[j].push(currLetter);

const segments = ['avgekcr', 'efgghe', 'ewlskffd'];
console.log(segments)
let cols = [];
let currSegment, currLetter;

for ( let i = 0; i < segments.length; i += 1 ) cols.push([]);

console.log(cols[2])
//cols.push([])
console.log(cols.length + ' :L')

for ( let j = 0; j < segments.length; j += 1 ) {
  currSegment = segments[j];
  for (let k = 0; k < currSegment.length; k += 1 ) {
    currLetter = currSegment[k]
    cols[j].push(currLetter);
  }
}
console.log(cols);

答案 2 :(得分:0)

您仅将空数组推入col变量2次。您正在尝试访问从0到7的cols [k](如果我们考虑了segments数组中的第一个索引)。

答案 3 :(得分:0)

cols[k]不存在-使用cols[j]

const segments = ['avgekcr', 'efgghe', 'ewlskffd'];
let cols = [];
let currSegment, currLetter;

for (let i = 0; i < segments.length; i += 1) cols.push([]);

for (let j = 0; j < segments.length; j += 1) {
  currSegment = segments[j];
  for (let k = 0; k < currSegment.length; k += 1) {
    currLetter = currSegment[k]
    cols[j].push(currLetter);

  }
}

console.log(cols);

您还可以像这样优化和简化代码:

const segments = ['avgekcr', 'efgghe', 'ewlskffd'];
const cols = segments.map(e => [...e]);

console.log(cols);

上面的方法要快得多-复杂度为O(N),因为您要遍历segments一次。

答案 4 :(得分:0)

cols仅包含3个空数组,并且在某个时刻k将大于2,因此cols[k]返回undefined

答案 5 :(得分:0)

我不关心您的预期结果,只是指出您的代码中的错误。 看看您的内部for循环:

for (let k = 0; k < currSegment.length; k += 1) {
        currLetter = currSegment[k]
        cols[k].push(currLetter);

    }

循环在字母'avgekcr'上运行,该字母的长度为7,而 cols 数组的长度仅为3。因此,cols [3]是未定义的,因此只会引发错误:

Cannot read property 'push' of undefined

答案 6 :(得分:0)

使用以下方法将元素添加到“ cols”,因为“ cols”是一维数组。仅当cols [k] .push是多维数组时,才能使用它。

cols.push(currSegment[k]);   // no need to define an additional variable to keep currSegment[k] value

对于您的实现,您只需使用split函数将字符串制作为char数组,然后concat函数将先前的cols和新的char数组合并。

const segments = ['avgekcr', 'efgghe', 'ewlskffd'];
let cols = [];

for (let i = 0; i < segments.length; i++) {
    cols = cols.concat(segments[i].split(''));
}

如果需要访问二维数组中的所有段,请使用以下方法。

for (let i = 0; i < segments.length; i++) {
    cols.push([]);
    cols[i] = segments[i].split('');
}