Звернення до об’єкта


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' }. За допомогою цього ви можете отримати доступ до повідомлення за допомогою id : alerts[2] => { app: 'helloworld', message: 'message' }. Отримання довжини потім просто: Object.keys(alerts).length(цей біт є простіше з масивами)
Matt

61

jQuery $.extend(obj1, obj2)об'єднав би два об'єкти для вас, але ви дійсно використовуєте масив.

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);

Розширення JQuery повільне: trevmex.com/post/2531629773/jquerys-extend-is-slow . Також є друкарська помилка. $ .extends () має читати $ .extend ().
кен

Хороший улов з друку. Бувають ситуації, коли $ .extends є корисним, але ви праві, що цього слід уникати, коли це можливо.
повагаTheCode

1
Я думаю, що exte () нормально, коли у вас є лише одна структура записів, без дужок, для решти я згоден з повагоюTheCode, просто використовуйте 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"}
} 

EDIT: Щоб вирішити коментар щодо отримання наступного ключа, ви можете отримати масив ключів за допомогою функції 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
Так, я згоден .. У питанні немає масиву об'єктів, а просто об'єкт, тому це ідеальна відповідь!
Кішан Оза

Це правильна відповідь; як ви можете знати, в який індекс ви збираєтеся додати новий об’єкт?
Capan

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


Це не спрацює, якщо ви видалили сповіщення або пропустили ключ. Ви повинні додати що - то вздовж ліній 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'} }

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"

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"});

Працює досить добре, це додасть його до початку масиву.


Це не спрацювало, тому що я не можу викликати сплайс на об'єкт, лише на масив.
Річард Вульф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.