Добавление к объекту

У меня есть объект, который содержит предупреждения и некоторую информацию о них:

var alerts = { 
    1: { app: 'helloworld', message: 'message' },
    2: { app: 'helloagain', message: 'another message' }
}

В дополнение к этому у меня есть переменная, которая сообщает, сколько существует предупреждений, alertNo. Мой вопрос: когда я иду, чтобы добавить новое оповещение, есть ли способ добавить оповещение на объект alerts?

Ответ 1

Как сохранить оповещения в виде записей в массиве вместо свойств одного объекта?

var alerts = [ 
    {num : 1, app:'helloworld',message:'message'},
    {num : 2, app:'helloagain',message:'another message'} 
]

И затем, чтобы добавить один, просто используйте push:

alerts.push({num : 3, app:'helloagain_again',message:'yet another message'});

Ответ 2

jQuery $.extend(obj1, obj2) объединит для вас 2 объекта, но вы действительно должны использовать массив.

var alertsObj = {
    1: {app:'helloworld','message'},
    2: {app:'helloagain',message:'another message'}
};

var alertArr = [
    {app:'helloworld','message'},
    {app:'helloagain',message:'another message'}
];

var newAlert = {app:'new',message:'message'};

$.extend(alertsObj, newAlert);
alertArr.push(newAlert);

Ответ 3

Вы можете сделать это с помощью Object.assign(). Иногда вам нужен массив, но при работе с функциями, которые ожидают один объект JSON - например, вызов OData, - я обнаружил, что этот метод проще, чем создание массива только для его распаковки.

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}

alerts = Object.assign({3: {app:'helloagain_again',message:'yet another message'}}, alerts)

//Result:
console.log(alerts)
{ 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
    3: {app: "helloagain_again",message: "yet another message"}
} 

ОБНОВЛЕНИЕ: Чтобы обратиться к комментарию относительно получения следующего ключа, вы можете получить массив ключей с помощью функции Object.keys() - см. ответ Vadi для примера увеличения ключа. Аналогично, вы можете получить все значения с помощью Object.values() и пар ключ-значение с помощью Object.entries().

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}
console.log(Object.keys(alerts))
// Output
Array [ "1", "2" ]

Ответ 4

Как и в других ответах, вам может быть проще работать с массивом.

Если не:

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}

// Get the current size of the object
size = Object.keys(alerts).length

//add a new alert 
alerts[size + 1] = {app:'Your new app', message:'your new message'}

//Result:
console.log(alerts)
{ 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
    3: {app: "Another hello",message: "Another message"}
}      

попытайся:

https://jsbin.com/yogimo/edit?js,console

Ответ 5

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

alerts[3]={"app":"goodbyeworld","message":"cya"};

Но так как вы не должны использовать буквенные числа, так как имена котируются вообще и идут с

alerts['3']={"app":"goodbyeworld","message":"cya"};

или вы можете сделать его массивом объектов.

Доступ к нему выглядит как

alerts['1'].app
=> "helloworld"

Ответ 6

Вы можете использовать синтаксис распространения следующим образом.

var alerts = { 
1: { app: 'helloworld', message: 'message' },
2: { app: 'helloagain', message: 'another message' }
 }

alerts = {...alerts, 3: {app: 'hey there', message: 'another message'} }

Ответ 7

У вас есть возможность изменить внешнюю структуру в массив? Таким образом, это будет выглядеть как

var alerts = [{"app":"helloworld","message":null},{"app":"helloagain","message":"another message"}];

Поэтому, когда вам нужно добавить его, вы можете просто нажать его на массив

alerts.push( {"app":"goodbyeworld","message":"cya"} );

Затем у вас есть встроенный индекс на основе нуля для того, как перечисляются ошибки.

Ответ 8

Теперь с ES6 у нас есть очень мощный оператор распространения (... Object), который может сделать эту работу очень простой. Это можно сделать следующим образом:

let alerts = { 
   1: { app: 'helloworld', message: 'message' },
   2: { app: 'helloagain', message: 'another message' }
} 

//now suppose you want to add another key called alertNo. with value 2 in the alerts object. 

alerts = {
   alertNo: 2,
   ...alerts
 }

Это оно. Это добавит ключ, который вы хотите. Надеюсь это поможет!!

Ответ 9

В качестве альтернативы в ES6 может использоваться расширенный синтаксис. ${Object.keys(alerts).length + 1} возвращает следующий id для оповещения.

let alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
};

alerts = {
  ...alerts, 
  ['${Object.keys(alerts).length + 1}']: 
  { 
    app: 'helloagain${Object.keys(alerts).length + 1}',message: 'next message' 
  } 
};

console.log(alerts);

Ответ 10

С ES6 намного проще:

let exampleObj = {
  arg1: {
    subArg1: 1,
    subArg2: 2,
  },
  arg2: {
    subArg1: 1,
    subArg2: 2,
  }
};

exampleObj.arg3 = {
  subArg1: 1,
  subArg2: 2,
};

console.log(exampleObj);

Ответ 11

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

Это замечательно, если вы хотите передать объект Json, например, в вызов функции mongoDB и вставить новый ключ в условия, которые вы получаете. В этом случае я собираюсь вставить элемент myUid с некоторой информацией из переменной внутри моего кода:

// From backend or anywhere
let myUid = { _id: 'userid128344'};
// ..
// ..

  let myrequest = { _id: '5d8c94a9f629620ea54ccaea'};
  const answer = findWithUid( myrequest).exec();

// ..
// ..

function findWithUid( conditions) {
  const cond_uid = Object.assign({uid: myUid}, conditions);
  // the object cond_uid now is:
  // {uid: 'userid128344', _id: '5d8c94a9f629620ea54ccaea'}
  // so you can pass the new object Json completly with the new key
  return myModel.find(cond_uid).exec();
}

Ответ 12

Попробуйте следующее:

alerts.splice(0,0,{"app":"goodbyeworld","message":"cya"});

Хорошо работает, он добавит его в начало массива.

Ответ 13

alerts.unshift({"app":"goodbyeworld","message":"cya"});