В течение последних пяти недель я изо всех сил пытался найти лучшие способы обработки данных с помощью прототипов массивов. Каков наилучший метод прототипа? Почему он лучший? Когда я должен использовать его? Это был циклический мыслительный процесс, и как только я думаю, что он у меня есть, он ускользает от меня. Затем мне бросили двойные и тройные наборы данных, чтобы попытаться манипулировать ими. Зная, что это немного меньше, чем то, что я увижу в реальном мире, я хотел приложить все усилия, чтобы по-настоящему понять все тонкости прототипов массивов и способы погружения в бесконечные объемы данных.
Давайте начнем с того, что на самом деле представляет собой прототип массива. Прототипы массивов могут быть либо мутаторами, либо методами доступа. Это означает, что они могут изменять и мутировать массив или просто изменять существующий, создавая новый массив, фактически не затрагивая исходный. Они находятся в 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()
и не мог понять, почему он не возвращает то, что мне нужно. Но лучшее, что я нашел, это:
- Когда дело доходит до
.reduce()
, назовите свою учетную запись и оцените что-то, что на самом деле относится к данным, которые вы перебираете. В приведенном выше примере вместо использования acc и value я должен был использовать starArray для acc и starNames для значения (или что-то в этом роде). Сделайте так, чтобы вам было проще понять, что происходит и что вы пытаетесь повторить; нарисуй себе картину. При использовании таких слов, как аккумулятор и значение, это сбивает с толку, и я обнаружил, что забываю, что я вообще пытался решить. - Когда дело доходит до
.forEach()
, я нахожу его сбивающим с толку, потому что он ничего не возвращает (кроме undefined), так что было сложно разобраться. Я пришел к выводу, что.forEach()
— это скорее универсальный инструмент, и вы можете использовать его, когда не можете использовать другие методы. Это звучит правдоподобно, так как я иду к.forEach()
только тогда, когда не могу ничего добиться ни с кем из других.
Методы прототипа массива чрезвычайно полезны при попытке манипулировать данными из API или нескольких API. Мой самый большой совет, чтобы освоиться с этим, — номер 1 выше, но также практика, практика, практика. Поговорите о том, как вы можете использовать их для улучшения обработки данных, а также о том, почему вы выбрали именно этот путь.