การประกาศอาร์เรย์ของวัตถุ


87

ฉันมีตัวแปรซึ่งเป็นอาร์เรย์และฉันต้องการให้ทุกองค์ประกอบของอาร์เรย์ทำหน้าที่เป็นวัตถุตามค่าเริ่มต้น เพื่อให้บรรลุเป้าหมายนี้ฉันสามารถทำสิ่งนี้ในรหัสของฉันได้

var sample = new Array();
sample[0] = new Object();
sample[1] = new Object();

ใช้งานได้ดี แต่ฉันไม่ต้องการพูดถึงหมายเลขดัชนีใด ๆ ฉันต้องการให้องค์ประกอบทั้งหมดของอาร์เรย์ของฉันเป็นวัตถุ ฉันจะประกาศหรือเริ่มต้นได้อย่างไร

var sample = new Array();
sample[] = new Object();

ฉันลองใช้รหัสด้านบน แต่ไม่ได้ผล ฉันจะเริ่มต้นอาร์เรย์ของวัตถุโดยไม่ใช้หมายเลขดัชนีได้อย่างไร


1
คุณกำลังพยายามสร้างวัตถุอาร์เรย์ทั้งหมดโดยค่าเริ่มต้นหรือไม่?
Jeff Shaver

@Jeff Yupp คุณพูดถูก ..
Prasath K

ฉันไม่เห็นประเด็นในการทำเช่นนั้น บางทีการทำความเข้าใจว่าทำไมคุณถึงต้องการทำเช่นนี้จะช่วยให้เราเข้าใจวิธีแก้ปัญหาของคุณได้จริง
Jeff Shaver

1
อะไรอยู่ในวัตถุ? ดูเหมือนว่าการใช้งานarray.push(objYouWant )ภายในฟังก์ชันจะเป็นทางออกอย่างแน่นอนด้วยวิธีนี้ทุกครั้งที่เรียกใช้ฟังก์ชันจะเพิ่มวัตถุใหม่พร้อมคุณสมบัติที่คุณต้องการ
Jeff Shaver

1
ฉันไม่เห็นว่าการที่พวกมันเป็นวัตถุโดยอัตโนมัติจะช่วยสถานการณ์ของคุณได้อย่างไร
Jeff Shaver

คำตอบ:


90

ใช้array.push()เพิ่มรายการที่ส่วนท้ายของอาร์เรย์

var sample = new Array();
sample.push(new Object());

ในการทำnครั้งนี้ให้ใช้การforวนซ้ำ

var n = 100;
var sample = new Array();
for (var i = 0; i < n; i++)
    sample.push(new Object());

โปรดทราบว่าคุณสามารถแทนที่new Array()ด้วย[]และnew Object()ด้วย{}เพื่อให้มันกลายเป็น:

var n = 100;
var sample = [];
for (var i = 0; i < n; i++)
    sample.push({});

38

ขึ้นอยู่กับความหมายของการประกาศคุณสามารถลองใช้อ็อบเจกต์ลิเทอรัลในลิเทอรัลอาร์เรย์ :

var sample = [{}, {}, {} /*, ... */];

แก้ไข:หากเป้าหมายของคุณคืออาร์เรย์ที่มีundefinedรายการเป็นตัวอักษรว่างเปล่าโดยค่าเริ่มต้นคุณสามารถเขียนฟังก์ชันยูทิลิตี้ขนาดเล็ก:

function getDefaultObjectAt(array, index)
{
    return array[index] = array[index] || {};
}

จากนั้นใช้ดังนี้:

var sample = [];
var obj = getDefaultObjectAt(sample, 0);     // {} returned and stored at index 0.

หรือแม้กระทั่ง:

getDefaultObjectAt(sample, 1).prop = "val";  // { prop: "val" } stored at index 1.

แน่นอนว่าการกำหนดโดยตรงให้กับค่าส่งคืนของgetDefaultObjectAt()จะไม่ได้ผลดังนั้นคุณจึงไม่สามารถเขียน:

getDefaultObjectAt(sample, 2) = { prop: "val" };

@PrasathK คุณหมายความว่าคุณกำลังเติมอาร์เรย์ของคุณแบบไดนามิก (เช่นผ่านลูป) หรือไม่? push()จากนั้นคุณควรปฏิบัติตามคำตอบของแดเนียลและการใช้งาน
Frédéric Hamidi

@PrasathK การโหวตนั้นไม่ใช่ของฉัน ถ้าฉันเข้าใจคุณถูกต้องความคิดเห็นของ Jeff Shaver ภายใต้คำถามของคุณใช่ไหม
Frédéric Hamidi

26

คุณสามารถใช้เติม ()

let arr = new Array(5).fill('lol');

let arr2 = new Array(5).fill({ test: 'a' });
// or if you want different objects
let arr3 = new Array(5).fill().map((_, i) => ({ id: i }));

จะสร้างอาร์เรย์ 5 รายการ จากนั้นคุณสามารถใช้ forEach เช่น

arr.forEach(str => console.log(str));

สังเกตว่าเมื่อทำnew Array(5)มันเป็นเพียงวัตถุที่มีความยาว 5 และอาร์เรย์ว่างเปล่า เมื่อคุณใช้fill()คุณเติมแต่ละจุดด้วยสิ่งที่คุณต้องการ


ฉันบังเอิญเห็นมันในหน้าแรกหลังจากที่คุณโพสต์ มันดึงดูดสายตาของฉันเพราะมันเป็นคำถามเก่ากับคำตอบใหม่
melpomene

ฉันคิดว่านี่เป็นการใช้และเข้าใจยากเมื่อเทียบกับคำตอบอื่น ๆ
Sachin Shah

12

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

var arr = [];
function funcInJsFile() {
    // Do Stuff
    var obj = {x: 54, y: 10};
    arr.push(obj);
}

ในกรณีนี้ทุกครั้งที่คุณใช้ฟังก์ชันนั้นมันจะพุชวัตถุใหม่เข้าไปในอาร์เรย์


โอ้พระเจ้า .. ฉันมีตัวแปรมากกว่า 100 รายการในวัตถุเหล่านั้นและสำหรับแต่ละวัตถุหรือการเรียกใช้ฟังก์ชันฉันต้องเริ่มต้นค่าบางค่าสำหรับตัวแปรบางตัวเมื่อเริ่มต้นฟังก์ชัน
Prasath K

11

คุณไม่จำเป็นต้องสร้างช่องว่างObjectเลย คุณไม่สามารถทำอะไรกับพวกเขาได้ เพียงเพิ่มวัตถุการทำงานของคุณลงในตัวอย่างตามต้องการ ใช้pushตามที่ Daniel Imms แนะนำและใช้ตัวอักษรตามที่Frédéric Hamidi แนะนำ ดูเหมือนคุณจะต้องการโปรแกรม Javascript เหมือน C.

var samples = []; /* If you have no data to put in yet. */
/* Later, probably in a callback method with computed data */
/* replacing the constants. */
samples.push(new Sample(1, 2, 3)); /* Assuming Sample is an object. */
/* or */
samples.push({id: 23, chemical: "NO2", ppm: 1.4}); /* Object literal. */

ฉันเชื่อว่าการใช้new Array(10)สร้างอาร์เรย์ที่มี 10 undefinedองค์ประกอบ


10

คุณสามารถสร้างอินสแตนซ์อาร์เรย์ของ "ประเภทวัตถุ" ในบรรทัดเดียวเช่นนี้ (เพียงแค่แทนที่Object () ใหม่ด้วยวัตถุของคุณ):

var elements = 1000;
var MyArray = Array.apply(null, Array(elements)).map(function () { return new Object(); });

2
จะเกิดอะไรขึ้นถ้าฉันไม่รู้คุณค่าขององค์ประกอบ
Prasath K

6

ดีarray.lengthควรทำเคล็ดลับหรือไม่? บางอย่างเช่นฉันหมายความว่าคุณไม่จำเป็นต้องรู้ช่วงดัชนีถ้าคุณเพิ่งอ่าน ..

var arrayContainingObjects = [];
for (var i = 0; i < arrayContainingYourItems.length; i++){
    arrayContainingObjects.push {(property: arrayContainingYourItems[i])};
}

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

IF และสิ่งนี้ไม่ควรเกิดขึ้นในความคิดของฉันคุณไม่สามารถรับ Array-length ของคุณได้ ดังที่คุณกล่าวว่าไม่มีการรับหมายเลขดัชนีคุณสามารถทำได้ดังนี้:

var arrayContainingObjects = [];
for (;;){
    try{
        arrayContainingObjects.push {(property: arrayContainingYourItems[i])};
    }
}
catch(err){
    break;
}

เป็นเวอร์ชันที่ไม่ดีของเวอร์ชันด้านบน แต่ลูปจะทำงานจนกว่าคุณจะ "วิ่ง" ออกจากช่วงดัชนี


5

ลองสิ่งนี้ -

var arr = [];
arr.push({});

สิ่งนี้ทำให้องค์ประกอบเดียวเป็นวัตถุ .. ฉันต้องการให้องค์ประกอบทั้งหมดของฉันเป็นวัตถุ
Prasath K

1
@ShuklaSannidhya โพสต์นี้ไม่มีคำอธิบายว่าสิ่งนี้ทำอะไรและทำไมคุณถึงแนะนำ ...แค่พูด.
mickmackusa

5
//making array of book object
var books = [];
    var new_book = {id: "book1", name: "twilight", category: "Movies", price: 10};
    books.push(new_book);
    new_book = {id: "book2", name: "The_call", category: "Movies", price: 17};
    books.push(new_book);
    console.log(books[0].id);
    console.log(books[0].name);
    console.log(books[0].category);
    console.log(books[0].price);

// also we have array of albums
var albums = []    
    var new_album = {id: "album1", name: "Ahla w Ahla", category: "Music", price: 15};
    albums.push(new_album);
    new_album = {id: "album2", name: "El-leila", category: "Music", price: 29};
    albums.push(new_album);
//Now, content [0] contains all books & content[1] contains all albums
var content = [];
content.push(books);
content.push(albums);
var my_books = content[0];
var my_albums = content[1];
console.log(my_books[0].name);
console.log(my_books[1].name); 

console.log(my_albums[0].name);
console.log(my_albums[1].name); 

ตัวอย่างนี้ใช้ได้กับฉัน Snapshot สำหรับเอาต์พุตบน Browser Console


1

ใช้ array.push () เพื่อเพิ่มรายการที่ท้ายอาร์เรย์

var sample = new Array();
sample.push(new Object());

คุณสามารถใช้งานได้

var x = 100;
var sample = [];
for(let i=0; i<x ;i++){
  sample.push({}) 
  OR
  sample.push(new Object())
}    

1

การใช้ forEach เราสามารถจัดเก็บข้อมูลในกรณีที่เรามีข้อมูลอยู่แล้วที่เราต้องการเข้าสู่ระบบข้อมูลทางธุรกิจ

var sample = new Array();
var x = 10;
var sample = [1,2,3,4,5,6,7,8,9];
var data = [];

sample.forEach(function(item){
    data.push(item);
})

document.write(data);

ตัวอย่างโดยใช้ง่ายสำหรับลูป

var data = [];
for(var i = 0 ; i < 10 ; i++){
   data.push(i);
}
document.write(data);

1

หากคุณต้องการให้องค์ประกอบทั้งหมดภายในอาร์เรย์เป็นวัตถุคุณสามารถใช้ JavaScript Proxy เพื่อใช้การตรวจสอบความถูกต้องกับวัตถุก่อนที่คุณจะแทรกลงในอาร์เรย์ มันค่อนข้างง่าย

const arr = new Proxy(new Array(), {
  set(target, key, value) {
    if ((value !== null && typeof value === 'object') || key === 'length') {
      return Reflect.set(...arguments);
    } else {
      throw new Error('Only objects are allowed');
    }
  }
});

ตอนนี้ถ้าคุณพยายามทำสิ่งนี้:

arr[0] = 'Hello World'; // Error

มันจะส่งข้อผิดพลาด อย่างไรก็ตามหากคุณแทรกวัตถุจะได้รับอนุญาต:

arr[0] = {}; // Allowed

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ Proxies โปรดดูที่ลิงค์นี้: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

หากคุณกำลังมองหาการติดตั้ง polyfill คุณสามารถชำระเงินที่ลิงค์นี้: https://github.com/GoogleChrome/proxy-polyfill


1

รหัสด้านล่างจากโครงการของฉันอาจจะดีสำหรับคุณ

  reCalculateDetailSummary(updateMode: boolean) {

    var summaryList: any = [];
    var list: any;
    if (updateMode) { list = this.state.pageParams.data.chargeDefinitionList }
    else {
        list = this.state.chargeDefinitionList;
    }

    list.forEach((item: any) => {
        if (summaryList == null || summaryList.length == 0) {
            var obj = {
                chargeClassification: item.classfication,
                totalChargeAmount: item.chargeAmount
            };
            summaryList.push(obj);

        } else {
            if (summaryList.find((x: any) => x.chargeClassification == item.classfication)) {
                summaryList.find((x: any) => x.chargeClassification == item.classfication)
                    .totalChargeAmount += item.chargeAmount;
            }
        }
    });

    if (summaryList != null && summaryList.length != 0) {
        summaryList.push({
            chargeClassification: 'Total',
            totalChargeAmount: summaryList.reduce((a: any, b: any) => a + b).totalChargeAmount
        })
    }

    this.setState({ detailSummaryList: summaryList });
}

1
const sample = [];
    list.forEach(element => {
      const item = {} as { name: string, description: string };
      item.name= element.name;
      item.description= element.description;
      sample.push(item);
    });
    return sample;

ใครลองทำตามนี้.. และแนะนำบ้าง.


-7
var ArrayofObjects = [{}]; //An empty array of objects.

1
ฉบับที่นั่นเป็นอาร์เรย์ที่ไม่ว่างเปล่าของหนึ่งในวัตถุ
Quentin

ยินดีต้อนรับสู่ Stack Overflow! แม้ว่าข้อมูลโค้ดนี้จะช่วยแก้ปัญหาได้ แต่การมีคำอธิบายจะช่วยปรับปรุงคุณภาพของโพสต์ของคุณได้มาก โปรดจำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและบุคคลเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำโค้ดของคุณ โปรดพยายามอย่าเบียดโค้ดของคุณด้วยความคิดเห็นเชิงอธิบายซึ่งจะช่วยลดความสามารถในการอ่านโค้ดและคำอธิบาย!
kayess
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.