Как написать функцию, которая эмулирует _.each () из подчеркивания. js - PullRequest
1 голос
/ 05 мая 2020

Есть это упражнение, которое я не могу понять. Мне нужно написать функцию, которая имитирует подчеркивание. js function _.each () таким образом, чтобы получить тот же результат, а также пройти следующие тесты:

  • должен перебирать массив
  • должен перебирать объект
  • должен игнорировать прототип объекта
  • должен обращаться к исходной коллекции
  • должен связываться с контекстом, если он передан
  • должен вернуть коллекцию

Это пустая данная функция:

_.each= function (collection, iteratee, context) {} 

, и это то, что я написал до сих пор и не прошел ни один из тестов:

  _.each = function (collection, iteratee, context) {
    if (Array.isArray(collection)) {
      for (let key of collection) {
        console.log(key, collection.keys());
      }
    } else {
      for (let prop in collection) {
        if (collection.hasOwnProperty(prop)) {
          console.log(`${prop}: ${collection[prop]}`);
        }
      }
    }
    return collection
  };

Я пытаюсь выполнить итерацию по массиву с помощью for l oop и через объект с for in l oop, игнорируя свойства прототипа объекта. На самом деле я не хочу ни решать проблему, ни указывать код c, просто указывать sh в нужном направлении, а потом искать решение сам. Я новичок в JS и признаю, что не могу придумать, как решить эту проблему. Любой совет будет очень признателен. Спасибо

Ответы [ 2 ]

1 голос
/ 24 мая 2020

Вот подсказка. Надеюсь, это подтолкнет вас в правильном направлении.

_.each = function (collection, iteratee, context) {
  // you're going to want something that checks length of arguments and binds context to iteratee here

  if (Array.isArray(collection)) {
    for (let key of collection) { /* you're gonna need the index later so consider using
                                     for (let i = 0; i < collection.length; i++) {...} */

      console.log(key, collection.keys()); // replace this line with calling iteratee with item, i, and collection
    }
  } else {
    for (let prop in collection) {
      if (collection.hasOwnProperty(prop)) {
        console.log(`${prop}: ${collection[prop]}`); // replace this line with calling iteratee with collection[prop], prop, and collection
      }
    }
  }
  return collection
};
1 голос
/ 24 мая 2020

Обычно тест для реализации Each начинается с создания примера функции и коллекции примеров, а затем вызова вашей функции для них. Пример:

var array0 = [1,2,3];
var array1= [];
var iteratee = function (item) {
array1.push(item * 2);
}

Когда функция вызывается для каждого элемента, она будет делать то, что было указано. Итак, в этом случае он помещает результат умножения каждого элемента на 2 в пустой массив. Ожидаемый результат приведенного выше примера - это array1 с [2,4,6] в нем. Поскольку вы не написали часть, когда вызывается итерация, при запуске теста ничего не происходит.

...