Показать сообщение отдельно
  #9 (permalink)  
Старый 18.11.2018, 17:55
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Ассоциативный массив — тип данных, позволяющий хранить пары вида «(ключ, значение)».

В Javascript для организации ассоциативного массива используется тип Map. Однако, если предполагается, что в качестве ключей будут использоваться только строки, то можно использовать тип Object, как частный вид, а точней подобие ассоциативного массива.

Поскольку тип Object — это не ассоциативный массив, то вам нужно конкретно указать, что именно вы хотите сделать с объектом. Статичный метод Object.entries принимает объект, чьи перечислимые свойства будут возвращены в виде массива пар [key, value].

<script>
const pets = {
	Scratchy: "Guinea Pig",
	Squeeky: "Guinea Pig", 
	Fluffy: "Rabbit", 
	Thumper: "Rabbit", 
	Snoopy: "Dog", 
	Tiddles: "Cat"
};

for(const [key, value] of Object.entries(pets)) {
	document.write(`Свойство: ${key}. Значение свойства: ${value}<br>`);
}</script>


Сообщение от Aetae
А вообще всё это хрень и оверхед, что им мешало при закладке for of расширить его до работы с объектами(и вообще сделать объект iterable по умолчанию, строку же сделали) - непонятно. =(
Что вам мешает описать свою структуру данных со своим итератором хранящемся в свойстве Symbol.iterator. (Во встроенных типах именно так и сделано). Если вам нужен единственный экземпляр перечислимого «объекта», то и у него можно объявить свойство Symbol.iterator, указывающее, как его перечислять. (Пример выше для цели топик-стартера подходит идеально)

<script>
const pets = {
	Scratchy: "Guinea Pig",
	Squeeky: "Guinea Pig",
	Fluffy: "Rabbit",
	Thumper: "Rabbit",
	Snoopy: "Dog",
	Tiddles: "Cat",
	*[Symbol.iterator]() { yield* Object.entries(this) }
};

for(const [key, value] of pets) {
	document.write(`Свойство: ${key}. Значение свойства: ${value}<br>`);
}</script>


Сообщение от Aetae
К сожалению «красивого» способа перебора объекта в js так и не завезли.
Для этого существуют статичные методы Object.keys, Object.values и Object.entries, и цикл for-of. (Также можете объявить метод Symbol.iterator, в котором указывается реализация собственного алгоритма перечисления)

Ну и если говорить про ассоциативный массив, то его полному определению в JavaScript соответствует тип Map.
<script>
const pets = new Map([
	["Scratchy", "Guinea Pig"],
	["Squeeky", "Guinea Pig"],
	["Fluffy", "Rabbit"],
	["Thumper", "Rabbit"],
	["Snoopy", "Dog"],
	["Tiddles", "Cat"]
]);

for(const [key, value] of pets) {
	document.write(`Свойство: ${key}. Значение свойства: ${value}<br>`);
}
</script>


Сообщение от Aetae
А вообще всё это хрень и оверхед, что им мешало при закладке for of расширить его до работы с объектами(и вообще сделать объект iterable по умолчанию, строку же сделали) - непонятно. =(
Если вас интересуют у «объекта» только ключи или значения, то храните их в типе Set или Array, если и ключи и значения, то в типе Map. Конечно же представители этих типов перечисляемы.

Сообщение от Aetae
Конечно можно захреначить себе хэлпер типа:
В таком нет необходимости, поскольку существует статичный метод Object.entries и цикл for-of.

При реализации какой-либо структуры данных вам потребуется для неё своя собственная реализация перечисления. Например, итератор от массива не подойдёт для строк и т. д.
Ответить с цитированием