Khai báo mảng đối tượng


87

Tôi có một biến là một mảng và tôi muốn mọi phần tử của mảng hoạt động như một đối tượng theo mặc định. Để đạt được điều này, tôi có thể làm điều gì đó như thế này trong mã của mình.

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

Điều này hoạt động tốt, nhưng tôi không muốn đề cập đến bất kỳ số chỉ mục nào. Tôi muốn tất cả các phần tử của mảng của tôi là một đối tượng. Làm cách nào để khai báo hoặc khởi tạo nó?

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

Tôi đã thử mã trên nhưng nó không hoạt động. Làm cách nào để khởi tạo một mảng đối tượng mà không sử dụng số chỉ mục?


1
Vì vậy, bạn đang cố gắng tạo tất cả các đối tượng mục mảng, theo mặc định?
Jeff Shaver

@Jeff Yupp, bạn nói đúng ..
Prasath K

Tôi không thấy có ích khi làm như vậy. Có thể hiểu lý do tại sao bạn muốn làm theo cách này sẽ giúp chúng tôi hiểu cách thực sự giải quyết vấn đề của bạn.
Jeff Shaver

1
Những gì là trong các đối tượng? Nghe có vẻ như việc triển khai array.push(objYouWant )bên trong hàm chắc chắn sẽ là giải pháp, theo cách đó mỗi khi chạy hàm, nó sẽ thêm một đối tượng mới với bất kỳ thuộc tính nào bạn muốn.
Jeff Shaver

1
Tôi không hiểu việc chúng tự động trở thành đối tượng sẽ giúp ích gì cho tình huống của bạn.
Jeff Shaver

Câu trả lời:


89

Sử dụng array.push()để thêm một mục vào cuối mảng.

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

Để làm điều này, hãy nsử dụng một forvòng lặp.

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

Lưu ý rằng bạn cũng có thể thay thế new Array()với []new Object()với {}để nó trở thành:

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

38

Tùy thuộc vào ý bạn khi khai báo , bạn có thể thử sử dụng các ký tự đối tượng trong một ký tự mảng :

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

CHỈNH SỬA: Nếu mục tiêu của bạn là một mảng có undefinedcác mục là đối tượng rỗng theo mặc định, bạn có thể viết một hàm tiện ích nhỏ:

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

Sau đó, sử dụng nó như thế này:

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

Hoặc thậm chí:

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

Tất nhiên, việc gán trực tiếp cho giá trị trả về của getDefaultObjectAt()sẽ không hoạt động, vì vậy bạn không thể viết:

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

@PrasathK, có phải ý bạn là bạn đang tự động điền mảng của mình (ví dụ: thông qua một vòng lặp)? Sau đó, bạn nên làm theo câu trả lời của Daniel và sử dụng push().
Frédéric Hamidi

@PrasathK, phiếu phản đối đó không phải của tôi. Nếu tôi hiểu đúng về bạn thì comment của Jeff Shaver dưới câu hỏi của bạn là đúng?
Frédéric Hamidi

23

Bạn có thể sử dụng fill () .

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

Sẽ tạo một mảng gồm 5 mục. Sau đó, bạn có thể sử dụng forEach chẳng hạn.

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

Lưu ý rằng khi thực hiện new Array(5)nó chỉ là một đối tượng có độ dài 5 và mảng trống. Khi bạn sử dụng, fill()bạn lấp đầy từng chỗ riêng biệt với bất cứ thứ gì bạn muốn.


Tôi tình cờ thấy nó trên trang nhất ngay sau khi bạn đăng. Nó đập vào mắt tôi vì nó là một câu hỏi cũ với một câu trả lời mới.
melpomene

Tôi nghĩ đây là một câu trả lời khó sử dụng và dễ hiểu so với các câu trả lời khác.
Sachin Shah

12

Sau khi xem cách bạn trả lời trong các bình luận. Có vẻ như nó sẽ là tốt nhất để sử dụng pushnhư những người khác đã đề xuất. Bằng cách này, bạn không cần biết các chỉ số, nhưng bạn vẫn có thể thêm vào mảng.

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

Trong trường hợp này, mỗi khi bạn sử dụng hàm đó, nó sẽ đẩy một đối tượng mới vào mảng.


Ôi chúa ơi .. tôi có hơn 100 biến trong các đối tượng và cho mỗi và mọi đối tượng hoặc lời gọi tới hàm tôi phải khởi tạo một số giá trị cho một số các biến vào lúc bắt đầu của hàm
Prasath K

11

Bạn không thực sự cần phải tạo các khoảng trống Object. Bạn không thể làm gì với chúng. Chỉ cần thêm các đối tượng làm việc của bạn vào mẫu nếu cần. Sử dụng pushnhư Daniel Imms đề xuất, và sử dụng nghĩa đen như Frédéric Hamidi đề xuất. Bạn dường như muốn lập trình Javascript như 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. */

Tôi tin rằng việc sử dụng new Array(10)sẽ tạo ra một mảng có 10 undefinedphần tử.


10

Bạn có thể khởi tạo một mảng "kiểu đối tượng" trong một dòng như thế này (chỉ cần thay thế Đối tượng mới () bằng đối tượng của bạn):

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

2
Điều gì sẽ xảy ra nếu tôi không biết giá trị của các phần tử?
Prasath K

6

Cũng array.lengthcó nên làm thủ thuật hay không? đại loại như, ý tôi là bạn không cần biết phạm vi chỉ mục nếu bạn chỉ đọc nó ..

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

Có thể tôi đã không hiểu Câu hỏi của bạn một cách chính xác, nhưng bạn sẽ có thể hiểu được độ dài của Mảng theo cách này và chuyển chúng thành các đối tượng. Thành thật mà nói, Daniel đã đưa ra câu trả lời tương tự. Bạn chỉ có thể lưu độ dài mảng của mình vào biến của anh ta và nó sẽ được thực hiện.

NẾU và điều này sẽ không xảy ra theo quan điểm của tôi, bạn không thể có được độ dài Mảng của mình. Như bạn đã nói nếu muốn lấy số chỉ mục, bạn có thể làm như sau:

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

Đây là phiên bản không đẹp của phiên bản trên nhưng vòng lặp sẽ thực thi cho đến khi bạn "chạy" ra khỏi phạm vi chỉ mục.


5

Thử đi-

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

Điều này làm cho chỉ có một yếu tố để trở thành một đối tượng .. Tôi muốn tất cả các yếu tố của tôi là một đối tượng
Prasath K

1
@ShuklaSannidhya Bài đăng này thiếu giải thích về tác dụng của điều này và lý do bạn đề xuất nó. ... chỉ nói.
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); 

Ví dụ này Hoạt động với tôi. Ảnh chụp nhanh cho Đầu ra trên Bảng điều khiển Trình duyệt


1

Sử dụng array.push () để thêm một mục vào cuối mảng.

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

bạn co thể sử dụng no

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

1

Sử dụng forEach, chúng tôi có thể lưu trữ dữ liệu trong trường hợp chúng tôi đã có dữ liệu, chúng tôi muốn thực hiện một số đăng nhập kinh doanh trên dữ liệu.

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

Ví dụ bằng cách sử dụng vòng lặp for đơn giản

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

1

Nếu bạn muốn tất cả các phần tử bên trong một mảng là các đối tượng, bạn có thể sử dụng JavaScript Proxy để áp dụng xác thực trên các đối tượng trước khi bạn chèn chúng vào một mảng. Nó khá đơn giản,

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

Bây giờ nếu bạn cố gắng làm điều gì đó như sau:

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

Nó sẽ xuất hiện một lỗi. Tuy nhiên, nếu bạn chèn một đối tượng, nó sẽ được phép:

arr[0] = {}; // Allowed

Để biết thêm chi tiết về Proxy, vui lòng tham khảo liên kết này: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Nếu bạn đang tìm kiếm cách triển khai polyfill, bạn có thể xem liên kết này: https://github.com/GoogleChrome/proxy-polyfill


1

Đoạn mã dưới đây từ dự án của tôi có thể tốt cho bạn

  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;

Bất cứ ai thử điều này .. và đề xuất một cái gì đó.


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

1
Không. Đó là một mảng không rỗng của một đối tượng.
Quentin

Chào mừng bạn đến với Stack Overflow! Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Cũng vui lòng cố gắng không chèn mã của bạn với các nhận xét giải thích, điều này làm giảm khả năng đọc của cả mã và giải thích!
chèo thuyền kayess
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.