В моем последнем проекте я работал над реализацией Minesweeper на React-Redux. В этом процессе я часто обращаюсь к определенным квадратам в сетке. Обычно я делаю это, набрав:
grid[1][5]
что дало мне шестую клетку во втором ряду. (Ах, нулевая индексация.)
Для некоторой функциональности мне нужно было передавать наборы координат в виде массивов, а-ля [1, 5]. Чтобы получить доступ к этим аргументам, я набрал что-то вроде
grid[array[0]][array[1]]
Грязно, но ладно. По крайней мере, так я думал, прежде чем потратил добрых полчаса на отладку, не заметив ошибку прямо перед моим лицом. я на самом деле набрал
grid[array[0][array[1]]]
Я смутно помнил, что существует синтаксис ES6, который позволил бы избежать этой проблемы, но в то время я был так счастлив, обнаружив ошибку, что не стал заниматься рефакторингом. Оказывается, эта фича называется деструктурирующее присваивание, и это здорово.
Деструктуризация — это мощный и удобный способ извлечения значений из объектов/массивов Javascript. Я мог бы избавить себя от головной боли, если бы просто сказал:
let [row, column] = array row => 1 column => 5 grid[row][column]
Он также работает с различными уровнями вложенности! Допустим, я просматривал всю свою сетку (скажем, 6х6) и хотел снова найти квадрат 1, 5.
let [ ,[ , , , , , square]] = grid square => {clicked: false, column: 5, flag: false, mine: false, row: 1, text: 3}
Также возможна деструктуризация объекта. Я знаю, что он немного круглый, но для демонстрации я возьму номер строки и столбца из квадратного объекта.
let {row: a, column: b} = square a => 1 b => 5
Чем более вложенными являются ваши данные, тем более сложной может выглядеть ваша деструктуризация. Это только поверхностные сведения о возможностях, но есть еще масса информации.
This tutorial is quite detailed, with fun examples. Here’s a textbook chapter that includes a behind-the-scenes look at the algorithm. And here’s somebody’s great Gist if you just want to see some code in action.