Страницы

Поиск по вопросам

среда, 5 июня 2019 г.

Обращение к объекту, как к массиву

Есть ли простой способ обратиться к ключу объекта по его индексу? Может в Underscore есть магические методы?
Вопрос возник на фоне такой задачи. Есть объект:
plane: { 432: { columns: { 543: { name: 'lolo' }, 984: { name: 'lala' }, ... } }, ... }
Где среди n-го количества plane, и n-го количества column нужно выбрать первый plane и первый column внутри него.
Как сделать это проще всего?


Ответ

Хотя ES6 обеспечивает определённый порядок ключей при обходе, гораздо правильнее и удобнее использовать массив, положив тот ключ внутрь объекта, например, в поле id.

Но если уж очень хочется, то можно сделать так (как-нибудь сократив название):
Object.prototype.getByKeyIndex = function (i) { var key = Object.keys(this)[i]; return key && this[key]; }
Тогда на объекте из вопроса будет такое:
plane.getByKeyIndex(0).columns.getByKeyIndex(1).name // "lala"
Вроде, более-менее нормально выглядит.

Ключ сохраняется в переменную и проверяется, чтобы в таком варианте получилось undefined:
({ undefined: 42 }).getByKeyIndex(256)

Я новичок и хочу у Вас спросить - хорошо ли изменять прототип нативных объектов? Что будет если я добавлю метод, а после кто-то другой тоже Ваш ответ увидит и решит добавить свой, но с таким же методом?
В большинстве случаев изменять прототип Object'а не очень хорошо. Но для защиты от прототипных свойств принято фильтровать for-in через hasOwnProperty. Другой вариант - добавлять в прототип не так, как это сделал я, а через скрытое свойство, чтобы оно не перебиралось.
Если двое добавили одинаковое свойство, то одно из них перезапишет другое. По идее, последнее добавленное должно перезаписать предыдущее, но можно пошаманить с readonly, чтобы осталось более раннее. В любом случае, такая ситуация заведомо плохая и лучше в неё не попадать.
Если двое добавят одну и ту же функцию под разными именами, то будет две функции. Тут вроде всё очевидно и вопросов вызывать не должно.
Что касается того, стоит ли изменять прототип. Если это изменение упростит половину кода, то, на мой взгляд, это оправдано. Если же это делается ради одной функции, то, скорее всего, нет. Для любых глобальных изменений стоит проявлять разумность и осторожность.

Комментариев нет:

Отправить комментарий