簡體   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