วิธีการเพิ่มวัตถุลงในอาร์เรย์


317

ฉันจะเพิ่มวัตถุลงในอาร์เรย์ได้อย่างไร (ใน javascript หรือ jquery) ตัวอย่างเช่นปัญหาของรหัสนี้คืออะไร

function(){
    var a = new array();
    var b = new object();
    a[0]=b;
}

ฉันต้องการใช้รหัสนี้เพื่อบันทึกวัตถุจำนวนมากในอาร์เรย์ของ function1 และเรียก function2 เพื่อใช้วัตถุในอาร์เรย์

  1. ฉันจะบันทึกวัตถุในอาร์เรย์ได้อย่างไร
  2. ฉันจะวางวัตถุลงในอาร์เรย์และบันทึกลงในตัวแปรได้อย่างไร

12
โปรดอย่าแก้ไขข้อผิดพลาดในรหัสที่โพสต์เช่นเดียวกับการแก้ไข 5 หากคุณแก้ไขข้อผิดพลาดอย่างง่ายในคำถามมักจะไม่มีเหตุผลที่คำตอบจะมีอยู่
พอล

นอกจากนี้ยังpushได้รับการแนะนำหลายครั้งที่นี่แล้ว โปรดอย่าทำให้กระทู้นี้สกปรกอีกต่อไปหากมีpushข้อเสนอแนะอื่น
Boghyon Hoffmann

คำตอบ:


631

ใส่อะไรลงในอาร์เรย์โดยใช้ Array.push ()

var a=[], b={};
a.push(b);    
// a[0] === b;

ข้อมูลเพิ่มเติมเกี่ยวกับอาร์เรย์

เพิ่มครั้งละมากกว่าหนึ่งรายการ

var x = ['a'];
x.push('b', 'c');
// x = ['a', 'b', 'c']

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

var x = ['c', 'd'];
x.unshift('a', 'b');
// x = ['a', 'b', 'c', 'd']

เพิ่มเนื้อหาของอาเรย์หนึ่งไปยังอีกอาเรย์

var x = ['a', 'b', 'c'];
var y = ['d', 'e', 'f'];
x.push.apply(x, y);
// x = ['a', 'b', 'c', 'd', 'e', 'f']
// y = ['d', 'e', 'f']  (remains unchanged)

สร้างอาร์เรย์ใหม่จากเนื้อหาของสองอาร์เรย์

var x = ['a', 'b', 'c'];
var y = ['d', 'e', 'f'];
var z = x.concat(y);
// x = ['a', 'b', 'c']  (remains unchanged)
// y = ['d', 'e', 'f']  (remains unchanged)
// z = ['a', 'b', 'c', 'd', 'e', 'f']

ฉันยังมีคำถาม: myArray = []; myArray.push ({'text': 'some text', 'id': 13}); และ myArray ตอนนี้ว่างเปล่า ดังนั้นถ้าเราลองรับค่าจาก myArray [0] ['text'] มันจะว่างเปล่าทำไม? take.ms/jSvbn
fdrv

บางอย่างดูไม่ถูกต้อง ตรวจสอบให้แน่ใจว่าไม่มีปัญหาการกำหนดขอบเขต ใช้ let / var เพื่อประกาศ myArray เพราะ myArray.push จะกลายพันธุ์ myArray เสมอ
John Strickler

58
var years = [];
for (i= 2015;i<=2030;i=i+1)
{
years.push({operator : i})
}

ที่นี่ปีอาร์เรย์จะมีค่าเช่น

years[0]={operator:2015}
years[1]={operator:2016}

มันดำเนินต่อไปเช่นนี้


55

ครั้งแรกของทั้งหมดไม่มีหรือobject arrayมีObjectและArray. ประการที่สองคุณสามารถทำได้:

a = new Array();
b = new Object();
a[0] = b;

ตอนนี้aจะเป็นอาร์เรย์ที่มีbองค์ประกอบเดียวเท่านั้น


4
+1 สำหรับคำตอบที่ซับซ้อนน้อยที่สุด ฉันได้ขยายมันด้านล่างเพื่อรวมคำตอบสำหรับคำถามของ OP 2
Sam

30

ใช้ES6สัญลักษณ์คุณสามารถทำสิ่งนี้:

สำหรับการต่อท้ายคุณสามารถใช้ตัวดำเนินการสเปรดเช่นนี้:

var arr1 = [1,2,3]
var obj = 4
var newData = [...arr1, obj] // [1,2,3,4]
console.log(newData);


20
  • เป็น JavaScript เป็นกรณีไป โทรnew array()และnew object()จะโยนReferenceErrorเนื่องจากไม่มีอยู่จริง
  • มันจะดีกว่าที่จะหลีกเลี่ยงnew Array()เนื่องจากพฤติกรรมที่ผิดพลาดได้ง่าย แต่กำหนดอาร์เรย์ใหม่ที่มี
    สำหรับวัตถุที่ใช้= [val1, val2, val_n]= {}
  • มีหลายวิธีเมื่อมันมาถึงการขยายอาร์เรย์ (ดังแสดงในจอห์นคำตอบวิธีที่ปลอดภัยที่สุดจะเป็นเพียงการใช้) แต่แทนที่จะconcat ส่งคืนอาร์เรย์ใหม่โดยปล่อยให้อาร์เรย์เดิมไม่มีการแตะต้อง เปลี่ยนแปลงการเรียกอาเรย์ซึ่งควรหลีกเลี่ยงโดยเฉพาะอย่างยิ่งถ้าอาเรย์ถูกกำหนดไว้ทั่วโลกpushconcatpush
  • นอกจากนี้ยังเป็นแนวปฏิบัติที่ดีในการตรึงวัตถุเช่นเดียวกับอาร์เรย์ใหม่เพื่อหลีกเลี่ยงการกลายพันธุ์ที่ไม่ได้ตั้งใจ วัตถุที่แช่แข็งนั้นไม่สามารถเปลี่ยนแปลงได้หรือขยายได้ (ตื้น)

การใช้คะแนนเหล่านั้นและเพื่อตอบคำถามสองข้อของคุณคุณสามารถกำหนดฟังก์ชันดังนี้:

function appendObjTo(thatArray, newObj) {
  const frozenObj = Object.freeze(newObj);
  return Object.freeze(thatArray.concat(frozenObj));
}

การใช้งาน:

// Given
const myArray = ["A", "B"];
// "save it to a variable"
const newArray = appendObjTo(myArray, {hello: "world!"});
// returns: ["A", "B", {hello: "world!"}]. myArray did not change.

2
"การใช้งาน" เป็นสิ่งที่ทำให้คำตอบที่ฉันต้องการ
HPWD

@ บ็อกฮยอนฉันอยากรู้เกี่ยวกับการแช่แข็งและการกลายพันธุ์ คุณกำลังพูดถึงการเปลี่ยนแปลงของอาเรย์ที่อาจเกิดขึ้นโดยตรงเนื่องจากวิธีการ concat หรือเนื่องจากการเปลี่ยนแปลงที่อาจเกิดขึ้นกับอาเรย์จากที่อื่น ๆ ในสคริปต์ในขณะที่อยู่ในกระบวนการของการดำเนินการ '.concat ()'? หากสิ่งที่สองสิ่งนี้ไม่ควรถูกป้องกันโดยอัตโนมัติเนื่องจาก javascript เป็นแบบเธรดเดียวแม้ว่าในกรณีของรหัสแบบอะซิงโครนัสเนื่องจากการควบคุมควรอย่างน้อยในทางทฤษฎีไม่ถูกส่งคืนจนกว่าวิธีการจะเสร็จสมบูรณ์?
jdmayfield

@jdmayfield: กลยุทธ์การประเมินของ JS คือ การเรียกร้องโดยวัตถุที่ใช้ร่วมกัน เมื่อวัตถุถูกส่งผ่านไปวัตถุเหล่านั้นจะไม่ถูกคัดลอก การกลายพันธุ์ในวัตถุเหล่านั้นในขณะที่ถูกส่งไปรอบ ๆ จะสามารถมองเห็นผู้โทรได้ทันทีโดยไม่คำนึงว่า mutator นั้นถูกเรียกแบบอะซิงโครนัสเสร็จสมบูรณ์หรือไม่ เนื่องจากผลข้างเคียงดังกล่าวมักนำไปสู่ข้อบกพร่องเราจึงส่งคืนวัตถุใหม่แยกออกจากวัตถุเดิม การทำให้วัตถุไม่เปลี่ยนรูป (เช่นผ่านfreeze) เป็นเพียงขั้นตอนเพิ่มเติมเพื่อป้องกันการกลายพันธุ์โดยไม่ได้ตั้งใจ
Boghyon Hoffmann

@jdmayfield: แต่ตามที่คุณอาจคาดเดาไว้แล้วการสร้างวัตถุใหม่ทุกครั้งอาจไม่มีประสิทธิภาพอย่างรวดเร็วเมื่อวัตถุมีขนาดใหญ่ สำหรับกรณีดังกล่าวมี libs ที่เป็นประโยชน์ซึ่งทำให้มันมีประสิทธิภาพโดยใช้ประโยชน์จากโครงสร้างข้อมูลแบบถาวรเช่นMori (นะตาย) และImmutable.js นี่คือคำแนะนำสั้น ๆ เกี่ยวกับ "ทำไมความไม่สามารถเปลี่ยนแปลงได้": youtu.be/e-5obm1G_FY
Boghyon Hoffmann

9

ขยายคำตอบของ Gabi Purcaru เพื่อรวมคำตอบให้กับหมายเลข 2

a = new Array();
b = new Object();
a[0] = b;

var c = a[0]; // c is now the object we inserted into a...

8

/* array literal */
var aData = [];

/* object constructur */
function Data(firstname, lastname) {
  this.firstname = firstname;
  this.lastname = lastname;
  this.fullname = function() {
    return (this.firstname + " " + this.lastname);
  };
}

/* store object into array */
aData[aData.length] = new Data("Java", "Script"); // aData[0]

aData.push(new Data("Jhon", "Doe"));
aData.push(new Data("Anna", "Smith"));
aData.push(new Data("Black", "Pearl"));

aData[aData.length] = new Data("stack", "overflow"); // aData[4]

/* loop arrray */
for (var x in aData) {
  alert(aData[x].fullname());
}

/* convert array of object into string json */
var jsonString = JSON.stringify(aData);
document.write(jsonString);


7

obejctเห็นได้ชัดว่าพิมพ์ผิด แต่ทั้งคู่objectและarrayต้องการตัวพิมพ์ใหญ่

คุณสามารถใช้มือสั้นnew Arrayและnew Objectเหล่านี้เป็น[]และ{}

.pushคุณสามารถผลักดันข้อมูลลงในอาร์เรย์ใช้ นี่เป็นการเพิ่มไปยังจุดสิ้นสุดของอาร์เรย์ หรือคุณสามารถตั้งค่าดัชนีให้เก็บข้อมูลได้

function saveToArray() {
    var o = {};
    o.foo = 42;
    var arr = [];
    arr.push(o);
    return arr;
}

function other() {
    var arr = saveToArray();
    alert(arr[0]);
}

other();

5

ในทางเลือกคำตอบนี้

หากคุณมีและอาร์เรย์เช่นนี้: var contacts = [bob, mary];

และคุณต้องการใส่อาเรย์อื่นในอาเรย์นี้คุณสามารถทำเช่นนี้ได้:

ประกาศตัวสร้างฟังก์ชั่น

function add (firstName,lastName,email,phoneNumber) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.phoneNumber = phoneNumber;
}

ทำให้วัตถุจากฟังก์ชั่น:

var add1 = new add("Alba","Fas","Des@gmail.com","[098] 654365364");

และเพิ่มวัตถุเข้าไปในอาร์เรย์:

contacts[contacts.length] = add1;

3
a=[];
a.push(['b','c','d','e','f']);

6
สวัสดียินดีต้อนรับสู่ SO โปรดอย่าเพิ่งถ่ายโอนรหัสเป็นคำตอบ อธิบายความคิดของคุณเพื่อให้ผู้ใช้สามารถเข้าใจได้ดียิ่งขึ้นว่าเกิดอะไรขึ้น ขอบคุณ
คธูลู

2

วิธีที่ฉันสร้างผู้สร้างวัตถุด้วยรายการอัตโนมัติ:

var list = [];

function saveToArray(x) {
    list.push(x);
};

function newObject () {
    saveToArray(this);
};

0

คุณกำลังประสบปัญหาขอบเขตหากคุณใช้รหัสของคุณเช่นนี้ คุณต้องประกาศมันนอกฟังก์ชั่นถ้าคุณวางแผนที่จะใช้มันระหว่างพวกเขา (หรือถ้าโทรผ่านมันเป็นพารามิเตอร์)

var a = new Array();
var b = new Object();

function first() {
a.push(b);
// Alternatively, a[a.length] = b
// both methods work fine
}

function second() {
var c = a[0];
}

// code
first();
// more code
second();
// even more code
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.