Как задать логику преобразования объекта в массив?
Есть класс
class Users { constructor() { this.store = [] } } |
class Users { constructor() { this.store = [] } }
Как сделать так, чтобы при преобразовании в массив
const u = new Users() console.log([...u]) |
const u = new Users() console.log([...u])
я передавал значение this.store
Дополнительно:
Что-то типа такого:
class Users { constructor() { this.store = [] } [Symbol.iterator] = () => this.store[Symbol.iterator]() } |
class Users { constructor() { this.store = [] } [Symbol.iterator] = () => this.store[Symbol.iterator]() }
Но взможно вам проще и красивее будет сделать самих User'ов наследником массива:
class Users extends Array { constructor() { super(); } } |
class Users extends Array { constructor() { super(); } }
И использовать сразу this вместо this.store со всеми методами массива кроме тех которые вы переопределите:).
- Спасибо!
Подскажи еще пожалуйста, как мне после создания экземпляра, ссылаться на него же, чтобы делать конкатенацию, если я правильно понял
https://jsfiddle.net/5bmfLqy8/2/И для чего в выражении
[Symbol.iterator] = () => this.store[Symbol.iterator]()
[Symbol.iterator] = () => this.store[Symbol.iterator]()
Нам обязательно надо добавлять в конце [Symbol.iterator]()?
По логике будто мы вызываем то, что сами добавили в виде [Symbol.iterator] = () => {...} - 1. MishaXXL, цепочки делаются так: https://jsfiddle.net/wmfqoLer/2/ просто не забывай возвращать из метода самого себя.
2. Мы не возвращаем массив, потому что оператор спред(...) работает не с массивом, а с итератором по этому массиву. Мы добавляем нашему классу итератор, путём присваивания специальному полю [Symbol.iterator] функции, которая запускает итератор напрямую из такого же поля нашего массива this.store. Само собой оно нужно. Разве что можно получить тот же самый итератор из массива неявно так: [Symbol.iterator] = () => this.store.values(), но под капотом конкретно для массива там происходит то же самое.
Если очень захотеть - можно написать свою функцию-итератор, что-то типа:* [Symbol.iterator]() { for (const value of this.store) { yield value; } } // или совсем уж руками: [Symbol.iterator]() { const values = this.store; let index = 0; return { next() { if (index < values.length) { return { value: values[index++], done: false }; } return { done: true }; } }; }
* [Symbol.iterator]() { for (const value of this.store) { yield value; } } // или совсем уж руками: [Symbol.iterator]() { const values = this.store; let index = 0; return { next() { if (index < values.length) { return { value: values[index++], done: false }; } return { done: true }; } }; }
- Aetae, спасибо!
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для преобразования объекта в массив в PHP можно воспользоваться различными способами в зависимости от структуры объекта и требуемого результата. Приведу несколько способов, которые могут быть полезны в различных ситуациях.
1. Метод get_object_vars:
```php
```
2. Преобразование в массив с помощью приведения типов:
```php
```
3. Использование метода __toArray:
```php
__toArray();
print_r($arr);
?>
```
4. Рекурсивное преобразование объекта и его свойств:
```php
```
Выберите подходящий способ в зависимости от требуемой логики и структуры объекта, который вы хотите преобразовать в массив. Надеюсь, это поможет вам решить задачу!