Ассциативный массив JS

154
29 января 2020, 11:00

Есть массив

let places = {};

Пытаюсь добавить к определённому ключу в конец его значений, новое:

places[carriage].push('key2_value3');

Но пишет ошибку - places[carriage].push is not a function

Answer 1

let places = {} это литерал объекта. let places = [] вот это новый пустой массив. При использовании метода push() не нужно указывать индекс массива. Этот метод сам вставит элемент в конец массива. Так что ваш пример будет выглядеть как-то так:

let places = [];
places.push('key2_value3');

Если вам нужно создать объект, у которого будут пары ключ/значение, тогда да. Нужно будет сделать примерно так.

let places = {};
places.carriage = 'value';

Через точку мы можем добавлять новые поля в объект и присваивать им значения. Если поле вашего объекта должно быть массивом, то сначала его нужно определить.

let places = {}; 
places.carriage = []; 
places.carriage.push('new value'); 
places.carriage.push('new value'); // добавим ещё один элемент в массив 
places.newField = []; // второй ключ-массив 
places.newField.push('anothe value'); 
places.newField.push('anothe value 2'); 
let otherKey = 'other'; 
places[otherKey] = []; 
places[otherKey].push('other'); 
console.log(places)

Answer 2

Объект {} в javasctipt представлен ассоциативным массивом, но его не принято называть массивом, его принято называть Объектом.

Вероятно ваш вопрос возник потому что Вы были знакомы с этой структурой данных раньше чем начали изучать javascript.

Когда в javascript идет речь про массив имеется в виду Array() или []

И следуя Вашей логике работы с объектом вы вероятно хотели нечто такое

let places = {}; 
 
// тут я предположил что carriage это все таки строка а не переменная 
push('carriage1', 'key2_value3');     
push('carriage1', 'key2_value4'); 
push('carriage2', 'key2_value1');     
push('carriage2', 'key2_value2'); 
 
function push(key, value){ 
   // проверяем наличие ключа в объекте 
   if (!places[key]) { 
      // если его нет присваиваем значению ключа новый пустой массив 
      places[key] = []; 
   }  
   // теперь можно смело добавлять элементы в массив,  
   // который лежит в объекте под ключом значение которого передано через переменну `key` 
   places[key].push(value)  
} 
 
console.log(places)

Коротко это можно записать вот так:

let places = {}; 
 
let push = (a, b) => (places[a] || (places[a] = [])).push(b); 
 
push('carriage1', 'key2_value3');    
push('carriage1', 'key2_value4');  
console.log(places)

READ ALSO
Не работает слайдер в js/jquery

Не работает слайдер в js/jquery

У меня есть две функции, которые показывают / скрывают элементы за счет манипуляции классами и css переходами:

129
Как реализовать прозрачность вокруг указателя?

Как реализовать прозрачность вокруг указателя?

Коллеги подскажите на JS(или на чистом css возможно) при помощи чего можно реализовать подобное решение https://wwwkikk

147
Проблема вывода в webpack

Проблема вывода в webpack

Сделал всё как в этой статье https://hackernooncom/how-to-build-a-react-project-from-scratch-using-webpack-4-and-babel-56d4a26afd32, но всегда по ходу выполнения всплывала вот эта ошибка:

153
Как сделать, чтобы webstorm смотрел на babel config?

Как сделать, чтобы webstorm смотрел на babel config?

Как сделать, чтобы webstorm смотрел на babel config? Нужно из babel вытянуть alias, чтобы при импорте файлов можно было через Ctrl переходить в файлБез использования...

147