Вывод ассоциативных массивов JavaScript
Каким образом можно вывести ключ и значение ассоциативного массива через JavaScript?
Пробую так, но система только выводит ключ и номер элемента массива но не значение. Как вывести значение? Код:
<script> |
Очевидно, что Object.keys получает ключи.
Тут нужно немного ручной работы: document.write(key + ' ' + pets[key] + '<br>');К сожалению "красивого" способа перебора объекта в js так и не завезли. |
Спасибо за ваш вариант, вроде можно еще так.
Код:
for (let key in pets) {И еще к примеру эта строка Код:
for (let key in pets) |
В 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>
|
:-?
<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>
|
рони, как обычно без ослика, как и 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)
}
Но это ещё больший оверхэд. |
Цитата:
|
Aetae,
:thanks: |
Ассоциативный массив — тип данных, позволяющий хранить пары вида «(ключ, значение)».
В 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>
Цитата:
<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>
Цитата:
Ну и если говорить про ассоциативный массив, то его полному определению в 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>
Цитата:
Цитата:
При реализации какой-либо структуры данных вам потребуется для неё своя собственная реализация перечисления. Например, итератор от массива не подойдёт для строк и т. д. |
Цитата:
Цитата:
Конечно, можно babel подкрутить и писать на своём особом js с блэкджеком, но печаль то как раз в оверхэде и отсутствии поведения из коробки, что babel просто спрячет под капот. |
Цитата:
С этим примером всё в порядке, я бы не сказал, что ассоциативный массив в JavaScript оторван от реальности. Во всяком случае в сравнении с другими языками вам не нужно писать ни на порядок меньше, ни на порядок больше кода. JavaScript
const pets = new Map([
["Scratchy", "Guinea Pig"],
["Squeeky", "Guinea Pig"],
["Fluffy", "Rabbit"],
["Thumper", "Rabbit"],
["Snoopy", "Dog"],
["Tiddles", "Cat"]
]);
for(const [key, value] of pets) {
console.log(`Свойство: ${key}. Значение свойства: ${value}`);
}
C# Запустить
using System;
using System.Collections.Generic;
class MainClass {
public static void Main (string[] args) {
var pets = new Dictionary<String, String> {
{ "Scratchy", "Guinea Pig" },
{ "Squeeky", "Guinea Pig" },
{ "Fluffy", "Rabbit" },
{ "Thumper", "Rabbit" },
{ "Snoopy", "Dog" },
{ "Tiddles", "Cat" }
};
foreach(var pair in pets) {
Console.WriteLine($"Свойство: {pair.Key}. Значение свойства: {pair.Value}");
}
}
}
Haskell Запустить
pets :: [(String, String)]
pets =
[
("Scratchy", "Guinea Pig"),
("Squeeky", "Guinea Pig"),
("Fluffy", "Rabbit"),
("Thumper", "Rabbit"),
("Snoopy", "Dog"),
("Tiddles", "Cat")
]
main :: IO()
main = mapM_ (
\(key, value) -> putStrLn $
"Свойство: " ++ key ++ ". Значение свойства: " ++ value
) pets
C++ Запустить
#include <map>
#include <iostream>
#include <cassert>
using namespace std;
int main(int argc, char **argv) {
map<string, string> pets = {
{ "Scratchy", "Guinea Pig" },
{ "Squeeky", "Guinea Pig" },
{ "Fluffy", "Rabbit" },
{ "Thumper", "Rabbit" },
{ "Snoopy", "Dog" },
{ "Tiddles", "Cat" }
};
for(auto const& [key, value] : pets) {
cout
<< "Свойство: "
<< key
<< ". Значение свойства: "
<< value
<< endl;
}
return 0;
}
Swift Запустить
let pets = [
"Scratchy": "Guinea Pig",
"Squeeky": "Guinea Pig",
"Fluffy": "Rabbit",
"Thumper": "Rabbit",
"Snoopy": "Dog",
"Tiddles": "Cat"
]
for (key, value) in pets {
print("Свойство: \(key). Значение свойства: \(value)")
}
|
Malleys,
:victory: |
Смотри в чём засада: когда мы делаем так
const pets = new Map([
["Scratchy", "Guinea Pig"],
["Squeeky", "Guinea Pig"],
["Fluffy", "Rabbit"],
["Thumper", "Rabbit"],
["Snoopy", "Dog"],
["Tiddles", "Cat"]
]);
мы создаём сначала шесть массивов, по две строки в каждом, потом ещё один массив содержащий эти шесть массивов, затем передаём всё это дело в конструктор, и только после некоего (вовсе не бесплатного) преобразования получаем Map. Совершенно лишние промежуточные телодвижения, оверхэд. |
| Часовой пояс GMT +3, время: 14:20. |