Добавление к объекту
У меня есть объект, который содержит предупреждения и некоторую информацию о них:
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"});