Присоединение к объекту

156

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

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

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

Стив Гаттузо
источник
6
Я думаю, что у вас есть проблема с вашим опубликованным json: 1: {app: 'helloworld', 'message'} => 1: {app: 'helloworld', message: 'a message'}?
Андреас Греч

Ответы:

235

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

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'});
Андреас Греч
источник
1
Этот ответ предполагает, что вы знаете идентификатор оповещения, которое будет добавлено. Ну, если вы уже знаете , что, то вы можете просто следовать первоначальному формату объект и сделать: alerts[3] = { app: 'hello3', message: 'message 3' }. При этом вы можете получить доступ сообщения по идентификатору: alerts[2] => { app: 'helloworld', message: 'message' }. Получение длины затем просто: Object.keys(alerts).length(этот бит является проще с массивами)
Matt
61

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);
respectTheCode
источник
JQuery расширяется медленно: trevmex.com/post/2531629773/jquerys-extend-is-slow . Также есть опечатка. $ .extends () должен читать $ .extend ().
Кен
Хороший улов с опечаткой. Есть ситуации, когда $ .extends полезен, но вы правы, что его следует избегать, когда это возможно.
уважение TheCode
1
Я думаю, что extend () - это нормально, когда у вас есть только одна структура записи без скобок, в остальном я согласен с отношении theTheCode, просто используйте push ()
elvenbyte
39

Вы можете сделать это с 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
На самом деле это правильный ответ, так как другие ссылаются на преобразование объекта в массив, но таким образом вы сохраняете его как объект. В случае с автором, возможно, ему лучше работать с массивами, но это будет ответом о том, как добавить объект.
Горан Яковлевич
2
да, я согласен .. В вопросе нет массива объектов, это просто объект, так что это идеальный ответ!
Кишан Оза
Это правильный ответ, хотя; как узнать, по какому индексу вы собираетесь добавить новый объект?
Капан
1
это ответ на заглавный вопрос.
FistOfFury
11

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

Если не:

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

MC
источник
Это не будет работать, если вы удалили оповещения или пропустили ключ. Вы должны добавить что-то вроде while(alerts[size]) size++;И, возможно, переименовать sizeв newId.
до
11

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

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

alerts = {...alerts, 3: {app: 'hey there', message: 'another message'} }
inzo
источник
7

Теперь с 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 = {
   ...alerts,
   alertNo: 2
 }

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

Харшит Агарвал
источник
6

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

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

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

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

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

Доступ это выглядит как

alerts['1'].app
=> "helloworld"
dlamblin
источник
5

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

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

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

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

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

Питер Бейли
источник
2

Гораздо проще с ES6:

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

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

console.log(exampleObj);

{
arg1: {subArg1: 1, subArg2: 2}
arg2: {subArg1: 1, subArg2: 2}
arg3: {subArg1: 1, subArg2: 2}
}
Марун Мелем
источник
0

В качестве альтернативы в 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

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

Это замечательно, если вы хотите передать объект 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();
}

Марк
источник
0

[Javascript] После небольшой покерной игры, это сработало для меня:

 let dateEvents = (
            {
                'Count': 2,
                'Items': [
                    {
                        'LastPostedDateTime': {
                            "S": "10/16/2019 11:04:59"
                        }
                    },
                    {
                        'LastPostedDateTime': {
                            "S": "10/30/2019 21:41:39"
                        }
                    }
                ],
            }
        );
        console.log('dateEvents', dateEvents);

Проблема, которую мне нужно было решить, заключалась в том, что у меня может быть любое количество событий, и все они будут иметь одно и то же имя: LastPostedDateTime. Все, что отличается, это дата и время.

Дэвид Уайт
источник
-1

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

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

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

HM2K
источник
Это не сработало, потому что я не могу вызвать сплайс для объекта, только для массива.
Ричард Вульф