Получить из массива только те элементы, которые являются строкой, используя цикл

Помогите найти ошибку:

function f10(elem) {
  let out = '';
  let a10 = [
    [-2, '7', -3],
    [3, 4, -7],
    [-5, 6, -8, 32, 'a'],
    ['st', 21, -34, -43],
    [44, -56, 'task']
  ];

  for (let i = 0; i < elem.length; i++) {
    for (let k = 0; k < elem[i].length; k++) {
      if (typeof(elem) == 'string') {
        out += elem[i][k] + ' ';
        return out;
      }
    }
  }
  console.log(f10(a10));
  document.querySelector('.out-10').innerHTML = out;
}

document.querySelector('.b-10').onclick = f10;
<button class="button-primary b-10">Task-10</button>
<div class="out-10">out-10</div>


Ответы (1 шт):

Автор решения: OPTIMUS PRIME
  1. console.log(f10(a10)); — чтобы выполнить эту строчку, функция должна вызвать саму себя, которая в свою очередь чтобы выполнить такую же строчку, захочет вызвать саму себя и так бесконечно.

  2. document.querySelector('.b-10').onclick = f10; и function f10(elem) {... Функция f10 требует аргумента, а он не указан, по умолчанию этим аргументом становится event — объект события click. А в цикле event.length → undefined, i < undefined → сразу false, цикл даже не начинается. /// → ....onclick = function(){ f10(a10) }

  3. Непонимание областей видимости. Функция по задумке ожидает массив в качестве аргумента, а он создан внутри самой функции, а должен быть вне.

  4. Формально в таких задачках функции / классы пронумерованы, но хорошо бы не смотря на это начать привыкать давать им "говорящие" названия, а не однобуквенные.

let matrix = [
  [-2, '7', -3],
  [3, 4, -7],
  [-5, 6, -8, 32, 'a'],
  ['st', 21, -34, -43],
  [44, -56, 'task']
];

document.querySelector('.b-10').addEventListener('click', function(){
  document.querySelector('.out-10').innerHTML = getStrTypeElemsData(matrix);
});

function getStrTypeElemsData(matrix) {
  let data = '';
  
  for (let i = 0; i < matrix.length; i++) {
    for (let k = 0; k < matrix[i].length; k++) {
      if (typeof(matrix[i][k]) == 'string') {
        data += `Значение: ${ matrix[i][k] }, Строчка: ${ i }, Индекс: ${ k }<br>`;
      }
    }
  }
  
  return data;
}
<button class="b-10">Task-10</button>
<div class="out-10">out-10</div>

→ Ссылка