Мне трудно искать / объяснять, что я пытаюсь сделать, но я хочу добавить данные в объект JavaScript. Индекс, к которому я хочу добавить данные, может существовать или не существовать, и это имя индекса будет динамическим, поэтому я не могу просто определить все объекты в начале.

Допустим, я добавляю объект, когда пользователи нажимают на ссылки на моем сайте. Я определил свой объект:

exampleObject = {};

Если пользователь щелкает ссылку на фрукт, я хочу добавить фрукт к объекту. Я обычно делал бы это:

exampleObject.fruit = {};
exampleObject.fruit.strawberry = true;

Моя проблема в том, что я не хочу перезаписывать объект, когда пользователь нажимает на следующий фрукт. Мне нужно проверить, определен ли объект, а затем добавить к нему:

if ( typeof exampleObject.fruit === 'undefined' ){
    exampleObject.fruit = {};
    exampleObject.fruit.cherry = true;
} else {
    exampleObject.fruit.cherry = true;
}

Что мне интересно, если есть краткий способ выполнения условного выше? Я надеялся на один вкладыш, так как я буду делать это много. Моей следующей мыслью было создать для этого функцию, но я не хочу заново изобретать колесо или ограничивать себя (например, если я хочу использовать массив в этом объекте, чтобы поместить все фрукты в один индекс). jQuery - вариант в этом случае, но не обязательно мой первый выбор.

0
GreatBlakes 15 Дек 2015 в 19:11

3 ответа

Лучший ответ

Исходя из того, что вы сказали, что имя индекса будет динамическим, используйте квадратные скобки для настройки ключа / индекса объекта:

function addFruit (name) {

  exampleObject = exampleObject || {};
  exampleObject.fruit = exampleObject.fruit || {};

  if (typeof exampleObject.fruit[name] == 'undefined')
    exampleObject.fruit[name] = true;

}
1
shennan 15 Дек 2015 в 16:23
exampleObject = exampleObject || {};
exampleObject.fruit = exampleObject.fruit || {};
exampleObject.fruit.cherry = true;
2
Thiago Custodio 15 Дек 2015 в 16:14

Я бы пошел по пути функции, в зависимости от того, насколько экстремальны ваши новые индексы. Это позволит вам назначить категорию и элемент за один раз.

function checkOrAddKey(key, newItem) {
  if(!exampleObject.hasOwnProperty(key)) {
    exampleObject[key] = {};
    exampleObject[key][newItem] = true;
  }
  else {
    exampleObject[key][newItem] = true;
  }
}

checkOrAddKey('fruit', 'apple');
checkOrAddKey('fruit', 'banana');
checkOrAddKey('scone', 'cinnamon');

//exampleObject: { fruit: { apple: true, banana: true }, scone: { cinnamon: true } }
1
Brad 15 Дек 2015 в 16:36