В течение последних пяти недель я изо всех сил пытался найти лучшие способы обработки данных с помощью прототипов массивов. Каков наилучший метод прототипа? Почему он лучший? Когда я должен использовать его? Это был циклический мыслительный процесс, и как только я думаю, что он у меня есть, он ускользает от меня. Затем мне бросили двойные и тройные наборы данных, чтобы попытаться манипулировать ими. Зная, что это немного меньше, чем то, что я увижу в реальном мире, я хотел приложить все усилия, чтобы по-настоящему понять все тонкости прототипов массивов и способы погружения в бесконечные объемы данных.

Давайте начнем с того, что на самом деле представляет собой прототип массива. Прототипы массивов могут быть либо мутаторами, либо методами доступа. Это означает, что они могут изменять и мутировать массив или просто изменять существующий, создавая новый массив, фактически не затрагивая исходный. Они находятся в JavaScript ES6 и в основном используются для перебора массивов (как цикл for). Наиболее распространенными из них, на которые я постоянно ссылаюсь, являются .reduce(), .forEach() и .map() =›, которые большую часть времени могут сбивать с толку.

Как уже упоминалось, я практиковался, пытаясь манипулировать данными, используя двойные наборы данных. Под этим я подразумеваю, что мне дали две переменные; один обычно представляет собой массив объектов, а другой — объект объектов (вот небольшой пример ниже).

const constellations = {
  orion: {
  names: [‘Orion’, ‘The Hunter’, ‘The Giant’, ‘The Deer’],
  stars: [‘Betelgeuse’, ‘Rigel’, ‘Bellatrix’, ‘Mintaka’, ‘Alnilam’,   ‘Alnitak’, ‘Saiph’]
  }
}

const stars = [
 {
  name: ‘Sirius’,
  visualMagnitude: -1.46,
  constellation: ‘Canis Major’,
  lightYearsFromEarth: 8.6,
  color: ‘blue’
 },
 {
  name: ‘Canopis’,
  visualMagnitude: -0.74,
  constellation: ‘Carina’,
  lightYearsFromEarth: 310,
  color: ‘white’
  }
]

Кроме того, пример проблемы, в которую нам нужно погрузиться:

Return an array of all the stars that appear in any of the constellations.
//OUTCOME:
let result = Object.keys(constellations).filter(key => {
   stars.reduce((acc, value) => {
     if(!constellations[key].stars.includes(value.name)) {
       acc.push(value)
     }
     return acc;
   }, []);
 });

Как вы можете видеть здесь, мы используем методы прототипа объекта и несколько различных методов прототипа массива. Это тот случай, когда это может сильно запутать. Опять же, как узнать лучший сценарий и как лучше всего понять поток погружения в эти данные? Было так много раз, когда я забывал вернуть аккумулятор в моей функции .reduce() или использовал .forEach() и не мог понять, почему он не возвращает то, что мне нужно. Но лучшее, что я нашел, это:

  1. Когда дело доходит до .reduce(), назовите свою учетную запись и оцените что-то, что на самом деле относится к данным, которые вы перебираете. В приведенном выше примере вместо использования acc и value я должен был использовать starArray для acc и starNames для значения (или что-то в этом роде). Сделайте так, чтобы вам было проще понять, что происходит и что вы пытаетесь повторить; нарисуй себе картину. При использовании таких слов, как аккумулятор и значение, это сбивает с толку, и я обнаружил, что забываю, что я вообще пытался решить.
  2. Когда дело доходит до .forEach(), я нахожу его сбивающим с толку, потому что он ничего не возвращает (кроме undefined), так что было сложно разобраться. Я пришел к выводу, что .forEach() — это скорее универсальный инструмент, и вы можете использовать его, когда не можете использовать другие методы. Это звучит правдоподобно, так как я иду к .forEach() только тогда, когда не могу ничего добиться ни с кем из других.

Методы прототипа массива чрезвычайно полезны при попытке манипулировать данными из API или нескольких API. Мой самый большой совет, чтобы освоиться с этим, — номер 1 выше, но также практика, практика, практика. Поговорите о том, как вы можете использовать их для улучшения обработки данных, а также о том, почему вы выбрали именно этот путь.