Создание в объекте нового объекта с массивом одной командой

188
29 мая 2018, 08:10

Есть обычный объект:

let obj= {
   0: array('a', 'v', 3);
};

В какой-то момент времени я дополняю его

obj[0].push('new');

Но если мне нужно добавить данные в строку объекта, которой еще не было, то я получу ошибку. Так не работает:

obj[7].push('new_str');

Как сделать подобное? Нужно вводить проверку на существование индекса объекта, и если такого нет, то создавать его сначала? Или можно короче?

Answer 1

Добавьте объекту метод:

let obj = { ... }; 
obj.pushTo = function (index, value) {
  if (!this[index]) 
    this[index] = []; 
  this[index].push(value); 
}; 

, и используйте его одной строкой:

obj.pushTo(7, 'new_str');


Проверка на тип в методе не нужна, потому что если программист сам засунет в объект не-массив, и попытается работать с ним как с массивом - это будет ошибка программиста (и в таких ситуациях должно выбрасываться исключение).

Answer 2

К сожалению нужно проверить существует ли массив и массив ли это((

let obj = { 
   0: ['a', 'v', 3] 
}; 
obj[0].push('new'); 
if (Array.isArray(obj[7])) { 
  obj[7].push('new'); 
  console.log("1", obj); 
} 
obj[7] = []; 
if (Array.isArray(obj[7])) { 
  obj[7].push('new'); 
  console.log("2", obj); 
}

Answer 3

Можно как-то так:

obj[7] ? obj[7].push('new_str') : obj[7] = [],obj[7].push('new_str');
Answer 4

Именно одной командой вот так:

var obj= 
{ 
   0: ['a', 'v', 3] 
}; 
//Одновременное создание массива и добавление первой записи: 
if(!obj[7]) 
	obj[7] = ['new_str']; 
else obj[7].push('new_str'); 
 
console.log(obj[7]);

Это можно сделать и без проверки if(!obj[7]), но тогда будет перезапись массива, если таковой уже есть.

READ ALSO
Замена текста на иконки (js, react)

Замена текста на иконки (js, react)

Мне от сервера приходят ссылки на социальные сетиКак правильно заменить текст ссылки (item

180
Google extension webstore

Google extension webstore

Как с помощью javascript или другими способами показать кнопку "Установить"? Мне не смена браузера на хром нужно, а именно эту кнопку показатьПоменяв...

168
Как объединить JS скрипты в один JS?

Как объединить JS скрипты в один JS?

помогите пожалуйста объединить эти 3 скрипта в один, спасибо

180
css: десктопный и мобильный сайты

css: десктопный и мобильный сайты

Сделал сайт, который комфортно выглядит на мониторе, но на телефоне есть некоторые дискомфортные элементы:

217