Nối vào một đối tượng


156

Tôi có một đối tượng lưu giữ các cảnh báo và một số thông tin về chúng:

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

Ngoài ra, tôi có một biến cho biết có bao nhiêu cảnh báo , alertNo. Câu hỏi của tôi là, khi tôi đi thêm một cảnh báo mới, có cách nào để thêm cảnh báo vào alertsđối tượng không?


6
Tôi nghĩ rằng bạn có vấn đề với json đã đăng của mình: 1: {app: 'helloworld', 'message'} => 1: {app: 'helloworld', message: 'a message'}?
Andreas Grech

Câu trả lời:


235

Làm thế nào về việc lưu trữ các cảnh báo dưới dạng các bản ghi trong một mảng thay vì các thuộc tính của một đối tượng?

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

Và sau đó để thêm một, chỉ cần sử dụng push:

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

1
Câu trả lời này hy vọng bạn biết id của cảnh báo sẽ được thêm vào. Chà, nếu bạn đã biết điều đó, thì bạn có thể chỉ cần làm theo định dạng đối tượng ban đầu và làm : alerts[3] = { app: 'hello3', message: 'message 3' }. Với điều này, bạn có thể truy cập một tin nhắn bằng id : alerts[2] => { app: 'helloworld', message: 'message' }. Lấy chiều dài là sau đó chỉ cần: Object.keys(alerts).length(đó chút dễ dàng hơn với mảng)
Matt

61

jQuery $.extend(obj1, obj2)sẽ hợp nhất 2 đối tượng cho bạn, nhưng bạn thực sự nên sử dụng một mảng.

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

Phần mở rộng của JQuery chậm: trevmex.com/post/2531629773/jquerys-extend-is-slow . Ngoài ra, có một lỗi đánh máy. $ .extends () nên đọc $ .extend ().
ken

Bắt tốt với lỗi đánh máy. Có những tình huống mà $ .extends là hữu ích nhưng bạn đã đúng rằng nên tránh khi có thể.
tôn trọng TheCode

1
Tôi nghĩ rằng ext () là ổn khi bạn chỉ có một cấu trúc bản ghi, không có dấu ngoặc, đối với phần còn lại tôi đồng ý với respTheCode, chỉ cần sử dụng push ()
elvenbyte

39

Bạn có thể làm điều này với Object.assign () . Đôi khi bạn cần một mảng, nhưng khi làm việc với các hàm mong đợi một đối tượng JSON - chẳng hạn như một cuộc gọi OData - tôi đã thấy phương thức này đơn giản hơn là chỉ tạo một mảng để giải nén nó.

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: Để giải quyết nhận xét liên quan đến việc nhận khóa tiếp theo, bạn có thể nhận được một mảng các phím có chức năng Object.keys () - xem câu trả lời của Vadi để biết ví dụ về việc tăng khóa. Tương tự, bạn có thể nhận được tất cả các giá trị với các cặp Object.values ​​() và key-value với 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
Đây thực sự là câu trả lời chính xác vì những người khác đang đề cập đến việc chuyển đổi đối tượng thành mảng, nhưng theo cách này bạn đang giữ nó làm đối tượng. Trong trường hợp của tác giả, có thể tốt hơn là anh ta nên làm việc với các mảng, nhưng đây sẽ là câu trả lời về cách nối thêm vào một đối tượng.
Goran Jakovljevic

2
vâng tôi đồng ý .. Trong câu hỏi không có một mảng đối tượng, nó chỉ là một đối tượng nên đây là câu trả lời hoàn hảo!
Kishan Oza

Đây là câu trả lời thích hợp mặc dù; Làm thế nào bạn có thể biết chỉ mục nào bạn sẽ thêm đối tượng mới?
Capan

1
đây là câu trả lời cho câu hỏi tiêu đề
FistOfFury

11

Giống như các câu trả lời khác được chỉ ra, bạn có thể thấy dễ dàng hơn khi làm việc với một mảng.

Nếu không:

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

thử nó:

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


Điều này sẽ không hoạt động, nếu bạn đã xóa thông báo hoặc bỏ qua một phím. Bạn nên thêm một cái gì đó dọc theo dòng while(alerts[size]) size++;Và có thể đổi tên sizethành newId.
Đến

11

Bạn có thể sử dụng cú pháp lây lan như sau ..

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

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

7

Bây giờ với ES6, chúng ta có một toán tử trải rộng rất mạnh (... Object) có thể thực hiện công việc này rất dễ dàng. Nó có thể được thực hiện như sau:

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
 }

Đó là nó. Nó sẽ thêm chìa khóa bạn muốn. Hi vọng điêu nay co ich!!


6

Bạn thực sự nên đi với một loạt các đề xuất cảnh báo, nhưng nếu không, việc thêm vào đối tượng bạn đã đề cập sẽ như thế này:

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

Nhưng vì bạn không nên sử dụng số nguyên văn làm tên trích dẫn mọi thứ và đi với

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

hoặc bạn có thể làm cho nó một mảng các đối tượng.

Truy cập nó trông giống như

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

5

Bạn có khả năng thay đổi cấu trúc ngoài cùng thành một mảng không? Vì vậy, nó sẽ trông như thế này

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

Vì vậy, khi bạn cần thêm một, bạn có thể đẩy nó lên mảng

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

Sau đó, bạn có một chỉ mục dựa trên zero tích hợp để biết cách liệt kê các lỗi.


2

Cách dễ dàng hơn với 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

Thay thế, trong ES6, cú pháp lây lan có thể được sử dụng. ${Object.keys(alerts).length + 1}trở lại tiếp theo idđể cảnh báo.

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

Tôi xin lỗi nhưng tôi không thể nhận xét câu trả lời của bạn đã có do danh tiếng của tôi! ... vì vậy, nếu bạn muốn sửa đổi cấu trúc của đối tượng của mình, bạn phải làm như Thane Plummer nói, nhưng một mẹo nhỏ nếu bạn không quan tâm để đặt mục: nó sẽ được chèn vào vị trí đầu tiên nếu bạn không chỉ định số cho phần chèn.

Điều này thật tuyệt vời nếu bạn muốn chuyển một đối tượng Json chẳng hạn cho một lệnh gọi hàm mongoDB và chèn một khóa mới bên trong các điều kiện bạn nhận được. Trong trường hợp này tôi sẽ chèn một mục myUid với một số thông tin từ một biến trong mã của tôi:

// 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] Sau một chút trò đùa tinh nghịch, điều này hiệu quả với tôi:

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

Vấn đề tôi cần giải quyết là tôi có thể có bất kỳ số lượng sự kiện nào và tất cả chúng đều có cùng tên: LastPostedDateTime, tất cả những gì khác nhau là ngày và giờ.


-1

Thử cái này:

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

Hoạt động khá tốt, nó sẽ thêm nó vào đầu mảng.


Điều này không hoạt động vì tôi không thể gọi splice trên một đối tượng, chỉ trên một mảng.
Richard Woolf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.