ผนวกเข้ากับวัตถุ


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', ข้อความ: 'a message'}?
Andreas Grech

คำตอบ:


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' }id: การรับความยาวนั้นเป็นเพียง: 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);

JQuery ขยายช้า: trevmex.com/post/2531629773/jquerys-extend-is-slow นอกจากนี้ยังมีการพิมพ์ผิด $ .extends () ควรอ่าน $ .extend ()
เคน

จับได้ดีกับการพิมพ์ผิด มีสถานการณ์ที่ $ .extends มีประโยชน์ แต่คุณพูดถูกว่าควรหลีกเลี่ยงเมื่อเป็นไปได้
respectTheCode

1
ผมคิดว่าขยาย () เป็น ok เมื่อคุณมีเพียงโครงสร้างบันทึกหนึ่งโดยไม่ต้องวงเล็บสำหรับส่วนที่เหลือผมเห็นด้วยกับ respectTheCode เพียงแค่ใช้การผลักดัน ()
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 () - ดูคำตอบของ 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" ]

7
นี่เป็นคำตอบที่ถูกต้องเนื่องจากผู้อื่นอ้างถึงการเปลี่ยนวัตถุให้เป็นอาร์เรย์ แต่ด้วยวิธีนี้คุณจะทำให้มันเป็นวัตถุ ในกรณีของผู้เขียนเป็นไปได้ว่ามันจะดีกว่าสำหรับเขาที่จะทำงานกับอาร์เรย์ แต่นี่จะเป็นคำตอบเกี่ยวกับวิธีการผนวกเข้ากับวัตถุ
Goran Jakovljevic

2
ใช่ฉันเห็นด้วย .. ในคำถามที่ไม่มีวัตถุมากมายมันเป็นเพียงวัตถุดังนั้นนี่คือคำตอบที่สมบูรณ์แบบ!
Kishan Oza

นี่คือคำตอบที่เหมาะสมแม้ว่า; คุณจะรู้ได้อย่างไรว่าดัชนีใดที่คุณจะเพิ่มวัตถุใหม่
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 เรามีผู้ดำเนินการแพร่กระจายที่มีประสิทธิภาพมาก (... วัตถุ) ซึ่งสามารถทำให้งานนี้ง่ายมาก สามารถทำได้ดังนี้

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

ฉันขอโทษ แต่ฉันไม่สามารถแสดงความคิดเห็นคำตอบของคุณได้เนื่องจากชื่อเสียงของฉัน! ... ดังนั้นหากคุณต้องการแก้ไขโครงสร้างของวัตถุของคุณคุณต้องทำเช่น Thane Plummer พูด แต่เคล็ดลับเล็กน้อยถ้าคุณไม่สนใจ เพื่อใส่รายการ: มันจะถูกแทรกในตำแหน่งแรกถ้าคุณไม่ได้ระบุหมายเลขสำหรับการแทรก

นี่เป็นสิ่งที่ยอดเยี่ยมหากคุณต้องการส่งวัตถุ 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] หลังจาก pokery jiggery เล็กน้อยสิ่งนี้ใช้ได้สำหรับฉัน:

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

ใช้งานได้ดีมันจะเพิ่มไปยังจุดเริ่มต้นของอาร์เรย์


สิ่งนี้ไม่ทำงานเพราะฉันไม่สามารถเรียกรอยต่อบนวัตถุได้ แต่บนอาร์เรย์เท่านั้น
Richard Woolf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.