Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.11.2018, 20:18
Аспирант
Отправить личное сообщение для usa-1450 Посмотреть профиль Найти все сообщения от usa-1450
 
Регистрация: 10.01.2015
Сообщений: 31

Вывод ассоциативных массивов JavaScript
Каким образом можно вывести ключ и значение ассоциативного массива через JavaScript?

Пробую так, но система только выводит ключ и номер элемента массива но не значение. Как вывести значение?
Код:
<script>
pets =
      {
        Scratchy : 'Guinea Pig',
        Squeeky : 'Guinea Pig', 
        Fluffy : 'Rabbit', 
        Thumper : 'Rabbit', 
        Snoopy : 'Dog', 
        Tiddles : 'Cat'
      }
  
 Object.keys(pets).forEach(function(key,value){
		 document.write(key + ' ' + value + '<br>');
	 });	
</script>
Ответить с цитированием
  #2 (permalink)  
Старый 17.11.2018, 20:26
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Очевидно, что Object.keys получает ключи.
Тут нужно немного ручной работы:
document.write(key + ' ' + pets[key] + '<br>');
К сожалению "красивого" способа перебора объекта в js так и не завезли.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 17.11.2018, 21:25
Аспирант
Отправить личное сообщение для usa-1450 Посмотреть профиль Найти все сообщения от usa-1450
 
Регистрация: 10.01.2015
Сообщений: 31

Спасибо за ваш вариант, вроде можно еще так.

Код:
for (let key in pets) {
            document.write(`Свойство: ${key}. Значение свойства: ${pets[key]}<br>`);
        };
Скажите, а forEach - это метод объекта? Это не встроенная конструкция как в пхп например foreach?
И еще к примеру эта строка
Код:
for (let key in pets)
Здесь pets выступает в качестве объекта, а не массива?
Ответить с цитированием
  #4 (permalink)  
Старый 17.11.2018, 21:36
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

В javascript всё наследуется от объекта. Потому с массивом можно делать всё тоже что и с объектом(втч использовать перебор for in), а вот с объектом (напрямую) методы массива(forEach) не применить.

Просто for in не рекомендуется использовать на случай стороннего расширения прототипа:
<script>
Object.prototype.ext = 'нежданчик'

var pets = {cat: 'Котэ'}
 
for (let key in pets) {
            document.write(`Свойство: ${key}. Значение свойства: ${pets[key]}<br>`);
        };
</script>
При любом использовании for in рекомендуется использовать проверку на собственные свойства(что при Object.keys не нужно):
<script>
Object.prototype.ext = 'нежданчик'

var pets = {cat: 'Котэ'}
 
for (let key in pets) if(pets.hasOwnProperty(key)) {
            document.write(`Свойство: ${key}. Значение свойства: ${pets[key]}<br>`);
        };
</script>
__________________
29375, 35

Последний раз редактировалось Aetae, 17.11.2018 в 21:39.
Ответить с цитированием
  #5 (permalink)  
Старый 17.11.2018, 21:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068


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

 Object.entries(pets).forEach(function([key,value]){
		 document.write(key + ' ' + value + '<br>');
	 });
</script>
Ответить с цитированием
  #6 (permalink)  
Старый 17.11.2018, 23:46
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

рони, как обычно без ослика, как и Object.values.
А вообще всё это хрень и оверхед, что им мешало при закладке for of расширить его до работы с объектами(и вообще сделать объект iterable по умолчанию, строку же сделали) - непонятно. =(
Конечно можно захреначить себе хэлпер типа:
Object.prototype[Symbol.iterator] = function* () {
 for(let key in this) 
   if(this.hasOwnProperty(key))
     yield {key, value: this[key]};
};

for(let {value} of {a:1, b:2}){
  console.log(value)
}
Но это ещё больший оверхэд.
__________________
29375, 35

Последний раз редактировалось Aetae, 18.11.2018 в 00:07.
Ответить с цитированием
  #7 (permalink)  
Старый 18.11.2018, 00:15
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Сообщение от Aetae
рони, как обычно без ослика
как здорово что на сервере нет этого браузерного коллапса
Ответить с цитированием
  #8 (permalink)  
Старый 18.11.2018, 00:53
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Aetae,
Ответить с цитированием
  #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.

При реализации какой-либо структуры данных вам потребуется для неё своя собственная реализация перечисления. Например, итератор от массива не подойдёт для строк и т. д.
Ответить с цитированием
  #10 (permalink)  
Старый 18.11.2018, 23:03
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Сообщение от Malleys Посмотреть сообщение
Если вас интересуют у «объекта» только ключи или значения, то храните их в типе Set или Array, если и ключи и значения, то в типе Map. Конечно же представители этих типов перечисляемы.
Это всё благоглупости. В одном и том же коде иногда интересуют ключи, иногда значения, иногда и то и то. И хочется чтобы любая задача решалась красиво и аккуратно. Чистых же задач не существует.
Сообщение от Malleys Посмотреть сообщение
Что вам мешает описать свою структуру данных со своим итератором хранящемся в свойстве Symbol.iterator.
У всех этих "своих типов"(как и у Map с Set) нет няшного литерала.)
Конечно, можно babel подкрутить и писать на своём особом js с блэкджеком, но печаль то как раз в оверхэде и отсутствии поведения из коробки, что babel просто спрячет под капот.
__________________
29375, 35

Последний раз редактировалось Aetae, 18.11.2018 в 23:12.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод рекламного кода через javascript sosnovskij AJAX и COMET 0 11.04.2016 16:23
Вывод ссылки через Javascript johny_torr Общие вопросы Javascript 5 08.12.2013 22:44
вывод времени php + javascript TTongorovortoto Ваши сайты и скрипты 2 29.10.2011 00:11
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34