Присоединение к объекту - PullRequest
134 голосов
/ 06 марта 2009

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

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

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

Ответы [ 10 ]

215 голосов
/ 06 марта 2009

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

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'});
60 голосов
/ 11 июня 2010

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);
23 голосов
/ 02 июля 2018

Вы можете сделать это с помощью 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 () - см. Ответ Вади для примера увеличения ключа. Аналогично, вы можете получить все значения с помощью 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" ]
7 голосов
/ 09 марта 2018

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

Если нет:

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

4 голосов
/ 06 марта 2009

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

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

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

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

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

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

alerts['1'].app
=> "helloworld"
3 голосов
/ 06 марта 2009

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

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

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

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

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

1 голос
/ 27 января 2019

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

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

alerts = {...alerts, 3: {app: 'hey there', message: 'another message'} }
0 голосов
/ 16 мая 2019

Теперь с 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
 }

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

0 голосов
/ 24 января 2019

В качестве альтернативы в 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);
0 голосов
/ 20 мая 2010

Попробуйте это:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...