Làm thế nào để tạo một mảng các đối tượng bằng chữ trong một vòng lặp?


224

Tôi cần tạo một mảng các đối tượng bằng chữ như thế này:

var myColumnDefs = [
    {key:"label", sortable:true, resizeable:true},
    {key:"notes", sortable:true,resizeable:true},......

Trong một vòng lặp như thế này:

for (var i = 0; i < oFullResponse.results.length; i++) {
    console.log(oFullResponse.results[i].label);
}

Giá trị của keynên nằm results[i].labeltrong mỗi phần tử của mảng.

Câu trả lời:


395
var arr = [];
var len = oFullResponse.results.length;
for (var i = 0; i < len; i++) {
    arr.push({
        key: oFullResponse.results[i].label,
        sortable: true,
        resizeable: true
    });
}

18
bạn có thể bỏ qua var obj = {bit, chỉ cần đẩy chính nó.
Peter Bailey

3
tính toán độ dài chỉ một lần có lẽ là một ý tưởng tốt, tôi chọn thêm một var objđể làm cho mã rõ ràng hơn, tất nhiên bạn có thể bỏ qua nó, bạn có thể viết toàn bộ tập lệnh trong một dòng nếu bạn muốn :)
RaYell

3
@ Khangax, Độ dài không được "tính toán", đó là thao tác O (1).
Triptych

8
@Triptych - Có, nhưng đó là một tra cứu tài sản mà bạn thực hiện với mỗi lần lặp, không miễn phí và có thể tránh được. Tối ưu hóa vi mô? Có khả năng. Ngoài ra, đó là một giá trị "trực tiếp" - nếu bạn sửa đổi mảng trong vòng lặp, độ dài sẽ thay đổi trên các lần lặp liên tiếp có thể dẫn đến vô cùng. Tặng cái này một chiếc đồng hồ youtube.com/watch?v=mHtdZgou0qU
Peter Bailey

2
Vâng, nhưng bạn không sửa đổi mảng mỗi lần lặp. Nếu bạn là như vậy, sẽ thật nực cười khi so sánh với chiều dài trong hầu hết các trường hợp.
Triptych

61

Câu trả lời của RaYell là tốt - nó trả lời câu hỏi của bạn.

Dường như với tôi mặc dù bạn thực sự nên tạo một đối tượng được khóa bởi các nhãn với các đối tượng phụ làm giá trị:

var columns = {};
for (var i = 0; i < oFullResponse.results.length; i++) {
    var key = oFullResponse.results[i].label;
    columns[key] = {
        sortable: true,
        resizeable: true
    };
}

// Now you can access column info like this. 
columns['notes'].resizeable;

Cách tiếp cận trên phải nhanh hơn và thành ngữ hơn nhiều so với tìm kiếm toàn bộ mảng đối tượng để tìm khóa cho mỗi lần truy cập.


+1 kể từ giải pháp chính, có ý nghĩa hơn và giúp tôi đáp ứng nhu cầu của mình :)
won_joiner

Có vẻ như bạn đang thiếu dấu chấm phẩy sau khi bạn đặt khóa var?
siêu tiêu đề

Câu trả lời hay, đã tìm cách truy cập thông tin trong một thời gian, cảm ơn bạn
thatOneGuy

Điều gì xảy ra nếu chìa khóa cần nhiều hơn một lần! ['ghi chú'] có thể xảy ra nhiều hơn một lần thì chúng ta có thể làm gì?
Milson

1
Milson - trong trường hợp đó, nó không thực sự là "chìa khóa"
Triptych

13

Bạn có thể làm một cái gì đó như thế trong ES6.

new Array(10).fill().map((e,i) => {
   return {idx: i}
});


4

Điều này sẽ làm việc:

 var myColumnDefs = new Object();
 for (var i = 0; i < oFullResponse.results.length; i++) {
     myColumnDefs[i] = ({key:oFullResponse.results[i].label, sortable:true, resizeable:true});
  }

4

Trong cùng một ý tưởng của Nick Riggs nhưng tôi tạo ra một hàm tạo và đẩy một đối tượng mới trong mảng bằng cách sử dụng nó. Nó tránh sự lặp lại của các khóa của lớp:

var arr = [];
var columnDefs = function(key, sortable, resizeable){
    this.key = key; 
    this.sortable = sortable; 
    this.resizeable = resizeable;
    };

for (var i = 0; i < len; i++) {
    arr.push((new columnDefs(oFullResponse.results[i].label,true,true)));
}

3

Tôi sẽ tạo mảng và sau đó nối các đối tượng bằng chữ.

var myColumnDefs = [];

for ( var i=0 ; i < oFullResponse.results.length; i++) {

    console.log(oFullResponse.results[i].label);
    myColumnDefs[myColumnDefs.length] = {key:oFullResponse.results[i].label, sortable:true, resizeable:true};
}

3
var myColumnDefs = new Array();

for (var i = 0; i < oFullResponse.results.length; i++) {
    myColumnDefs.push({key:oFullResponse.results[i].label, sortable:true, resizeable:true});
}

7
Tốt hơn là bắt đầu một mảng bằng cách sử dụng []thay vì new Array().
RaYell

Cuộc thảo luận thú vị [] so với stackoverflow
Adrian P.

2

Nếu bạn muốn đi xa hơn @tetra với ES6, bạn có thể sử dụng cú pháp trải rộng Object và làm một cái gì đó như thế này:

let john = {
    firstName: "John",
    lastName: "Doe",
};

let people = new Array(10).fill().map((e, i) => {(...john, id: i});
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.