Создание объекта [почему функция возвращает пустой массив?]

Здравствуйте! Вопрос короткий. Подскажите пожалуйста, почему возвращается пустой массив:

function objOfMatches(array1, array2, callback) {
  let obj = {};

    for (let i = 0; i < array1; i++) {
      if(callback(array1[i]) == callback(array2[i])){
        obj.array1[i] = callback(array2[i]);
  }
  return obj;
}


console.log(objOfMatches(['hi', 'howdy', 'bye', 'later', 'hello'], ['HI', 'Howdy', 'BYE', 'LATER', 'hello'], function(str) { return str.toUpperCase(); }));

// should log: { hi: 'HI', bye: 'BYE', later: 'LATER' }
  1. В примере - синтаксическая ошибка: до вызова console.log не закрыта } от функции
  2. i < array1 тут скорее всего ошибка. Ты не то хотел иметь в виду.

Если разбираться самостоятельно эта задача поиска проблемы решается чисто механически: проверь чему равны callback(array1[i]) и callback(array2[i]) в цикле с помощью console.log. И ты увидишь что или цикл не вызвается или значения не ожидаемые или еще что.

1 лайк

Исправил!

  1. В цикле, заменил array1 на array1.length
  2. добавил скобку }
    Сейчас, ошибка следующая: TypeError: Cannot set property ‘0’ of undefined

Уверен, что ошибка здесь: obj.array1[i]
Вопрос просто в синтаксисе, а не в логики. Не знаю, почему так не проходит…

function objOfMatches(array1, array2, callback) {
  let obj = {};

    for (let i = 0; i < array1.length; i++) {
      if(callback(array1[i]) == callback(array2[i])){
        // console.log(callback(array2[i]));
        obj.array1[i] = callback(array2[i]);
  }
 }
 return obj;
}

Это мы тоже обсуждали с тобой. Это значит что есть где-то код вида EXPRESSION[0]. И значение EXPRESSION - undefined.

Плюс в ошибке есть еще строка где это происходит. Попробуй понять что может пойти не так.

1 лайк

Нашёл ошибку, но до конца не понял, почему нельзя писать так: obj.array[i], а только так obj[array1[i]]

Что ты имеешь в виду под “нельзя”? Можно писать обе записи. Правда они принципиально разного толка.

Вернее было бы думать “почему эта запись дает ошибку, а эта - нет”.

obj.array[i] - это обращение к i-тому элементу массива array что хранится в объекте obj. При этом если в объекте нет то этот код даст ошибку.

obj[array1[i]] это обращение к свойству объекта obj с таким названием как значение array1[i].

1 лайк