Почему я не могу поместить данные в массив? - PullRequest
2 голосов
/ 24 июня 2019

Можете ли вы сказать мне, почему этот код выдает ошибку? Я хочу создать многомерный массив

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

  }
}

Ошибка:

Uncaught TypeError: Невозможно прочитать свойство 'push' из неопределенного

Ответы [ 7 ]

1 голос
/ 24 июня 2019

Вы нажимаете с неверным индексом, исправили код.

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)
0 голосов
/ 24 июня 2019

Используйте следующий способ для добавления элементов в «cols», потому что «cols» - это одномерный массив.Вы можете использовать cols [k] .push только в том случае, если это многомерный массив.

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

А для своей реализации вы просто можете использовать функцию split, чтобы создать строку в массив char и функцию 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('');
}
0 голосов
/ 24 июня 2019

Меня не беспокоит ваш ожидаемый результат, я просто указываю на ошибку в вашем коде.Взгляните на свой внутренний цикл 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
0 голосов
/ 24 июня 2019

cols содержит только 3 пустых массива, и в некоторый момент k будет больше 2, поэтому cols[k] возвращает undefined.

0 голосов
/ 24 июня 2019

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 один раз.

0 голосов
/ 24 июня 2019

Вы поместили пустой массив в переменную col только 2 раза.Вы пытаетесь получить доступ к cols [k] от 0 до 7 (если мы рассматривали первый индекс в массиве сегментов).

0 голосов
/ 24 июня 2019

При значении 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...