繁体   English   中英

为什么我不能在阵列上推送数据?

[英]Why can't I push data on the array?

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

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

错误:

未捕获的类型错误:无法读取未定义的属性“推送”

您正在使用错误的索引,更正了代码。

 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)

使用第三次迭代后的k值,您试图将一个项目推送到一个实际上并不存在的索引中。

改变

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

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

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

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

我不关心您的预期结果,只是指出您代码中的错误。 看看你的内部 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

使用以下方式向“cols”添加元素,因为“cols”是一维数组。 只有当它是一个多维数组时,您才能使用 cols[k].push。

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

对于您的实现,您可以使用 split 函数将字符串转换为字符数组,并使用 concat 函数合并以前的列和新的字符数组。

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('');
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM