Cách thêm một đối tượng vào một mảng


317

Làm cách nào tôi có thể thêm một đối tượng vào một mảng (trong javascript hoặc jquery)? Ví dụ, vấn đề với mã này là gì?

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

Tôi muốn sử dụng mã này để lưu nhiều đối tượng trong mảng của hàm1 và gọi hàm2 để sử dụng đối tượng trong mảng.

  1. Làm thế nào tôi có thể lưu một đối tượng trong một mảng?
  2. Làm thế nào tôi có thể đặt một đối tượng trong một mảng và lưu nó vào một biến?

12
Vui lòng không sửa lỗi trong mã đã đăng, vì chỉnh sửa 5 đã làm. Nếu bạn sửa một lỗi đơn giản trong câu hỏi, thường thì không có lý do gì để câu trả lời tồn tại.
Paul

Ngoài ra, pushđã được đề xuất nhiều lần ở đây rồi. Xin vui lòng, không gây ô nhiễm chủ đề này nữa với một pushđề nghị khác .
Boghyon Hoffmann

Câu trả lời:


631

Đặt bất cứ thứ gì vào một mảng bằng Array.push ().

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

Thông tin thêm về Mảng

Thêm nhiều mục cùng một lúc

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

Thêm các mục vào đầu một mảng

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

Thêm nội dung của một mảng vào một mảng khác

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)

Tạo một mảng mới từ nội dung của hai mảng

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']

Tôi cũng có một câu hỏi: myArray = []; myArray.push ({'văn bản': 'một số văn bản', 'id': 13}); và bây giờ myArray trống rỗng. Vì vậy, nếu chúng ta thử lấy giá trị từ myArray [0] ['text'] thì nó sẽ trống, tại sao? mất.ms / jSvbn
fdrv

Một cái gì đó có vẻ không đúng. Hãy chắc chắn rằng không có vấn đề phạm vi. Sử dụng let / var để khai báo myArray. Bởi vì myArray.push sẽ luôn biến đổi myArray.
John Strickler

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

ở đây mảng năm có giá trị như

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

nó tiếp tục như thế này


55

Trước hết, không có objecthoặc array. Có ObjectArray. Thứ hai, bạn có thể làm điều đó:

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

Bây giờ asẽ là một mảng với bnhư là phần tử duy nhất của nó.


4
+1 cho câu trả lời ít phức tạp nhất. Tôi đã mở rộng nó bên dưới để bao gồm câu trả lời cho câu hỏi của OP 2.
Sam

30

Sử dụng ES6ký hiệu, bạn có thể làm một cái gì đó như thế này:

Để nối thêm, bạn có thể sử dụng toán tử trải rộng như thế này:

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


20
  • JavaScript phân biệt chữ hoa chữ thường . Gọi new array()new object()sẽ ném ReferenceErrorvì họ không tồn tại.
  • Tốt hơn hết là tránh hành vi dễ bị lỗinew Array() của nó . Thay vào đó, gán mảng mới với . Đối với các đối tượng, sử dụng .
    = [val1, val2, val_n]= {}
  • Có nhiều cách khi nói đến việc mở rộng một mảng (như trong câu trả lời của John ) nhưng cách an toàn nhất sẽ chỉ là sử dụng concatthay vì push. concattrả về một mảng mới, không để lại mảng ban đầu. pushlàm thay đổi mảng gọi cần tránh , đặc biệt nếu mảng được xác định toàn cục.
  • Đó cũng là một thực hành tốt để đóng băng đối tượng cũng như mảng mới để tránh các đột biến ngoài ý muốn. Một vật thể đông lạnh không thể đột biến cũng không thể mở rộng (nông).

Áp dụng những điểm đó và để trả lời hai câu hỏi của bạn, bạn có thể xác định một hàm như thế này:

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

Sử dụng:

// 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
"Cách sử dụng" là những gì làm cho câu trả lời ưa thích cá nhân của tôi.
HPWD

@boghyon, tôi tò mò về sự đóng băng và đột biến. Bạn đang nói về những thay đổi đối với mảng có thể xảy ra trực tiếp do phương thức concat hay vì những thay đổi có thể được thực hiện đối với mảng từ nơi khác trong tập lệnh trong khi đang thực hiện '.concat ()'? Nếu thứ hai, không nên tự động ngăn chặn điều này do javascript là một luồng đơn, ngay cả trong trường hợp mã không đồng bộ do điều khiển, ít nhất là về mặt lý thuyết, không được trả về cho đến khi phương thức được hoàn thành?
jdmayfield

@jdmayfield: Chiến lược đánh giá của JS được gọi bằng cách chia sẻ đối tượng . Khi các đối tượng được truyền xung quanh, chúng không được sao chép. Các đột biến trong các đối tượng đó, trong khi được truyền xung quanh, luôn được hiển thị ngay lập tức cho người gọi bất kể trình biến đổi đó có được gọi không đồng bộ, đã hoàn thành hay không. Vì các tác dụng phụ như vậy thường dẫn đến lỗi, chúng tôi sẽ trả lại đối tượng mới, tách rời khỏi đối tượng ban đầu. Làm cho các đối tượng không thay đổi (ví dụ thông qua freeze) chỉ là một bước bổ sung để ngăn chặn các đột biến ngoài ý muốn.
Boghyon Hoffmann

@jdmayfield: Nhưng như bạn có thể đã đoán được, việc tạo các đối tượng mới mỗi lần có thể trở nên kém hiệu quả khi các đối tượng trở nên khổng lồ. Đối với những trường hợp như vậy, có những lib hữu ích, giúp nó hoạt động hiệu quả bằng cách tận dụng các cấu trúc dữ liệu liên tục, chẳng hạn như Mori (loại chết) và Immutable.js . Dưới đây là một giới thiệu ngắn về "tại sao bất biến": youtu.be/e-5obm1G_FY
Boghyon Hoffmann

9

Mở rộng câu trả lời của Gabi Purcaru để bao gồm câu trả lời cho số 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

obejctrõ ràng là một lỗi đánh máy. Nhưng cả hai objectarraycần chữ in hoa.

Bạn có thể sử dụng tay ngắn cho new Arraynew Objectđây là []{}

Bạn có thể đẩy dữ liệu vào mảng bằng cách sử dụng .push. Điều này thêm nó vào cuối của mảng. hoặc bạn có thể đặt một chỉ mục để chứa dữ liệu.

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

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

other();

5

Trên xenativ trả lời là thế này.

nếu bạn có và mảng như thế này: var contacts = [bob, mary];

và bạn muốn đặt một mảng khác trong mảng này, bạn có thể làm điều đó theo cách này:

Khai báo hàm tạo

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

làm cho đối tượng từ hàm:

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

và thêm đối tượng vào mảng:

contacts[contacts.length] = add1;

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

6
Xin chào, chào mừng đến với SO. Xin đừng chỉ đổ mã như một câu trả lời. Giải thích suy nghĩ của bạn để người dùng có thể hiểu rõ hơn những gì đang diễn ra. Cảm ơn.
Cthulhu

2

Cách tôi tạo trình tạo đối tượng với danh sách tự động:

var list = [];

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

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

0

Bạn đang gặp vấn đề về phạm vi nếu bạn sử dụng mã của mình như vậy. Bạn phải khai báo nó bên ngoài các hàm nếu bạn định sử dụng nó giữa chúng (hoặc nếu gọi, chuyển nó dưới dạng tham số).

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
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.