Hàm push () đối tượng trong Javascript


101

Tôi có một đối tượng javascript (tôi thực sự lấy dữ liệu thông qua một yêu cầu ajax):

var data = {};

Tôi đã thêm một số thứ vào đó:

data[0] = { "ID": "1"; "Status": "Valid" }
data[1] = { "ID": "2"; "Status": "Invalid" }

Bây giờ tôi muốn xóa tất cả các đối tượng có trạng thái không hợp lệ (nhưng giữ nguyên thứ tự mọi thứ):

var tempData = {};
for ( var index in data ) {
    if ( data[index].Status == "Valid" ) {
        tempData.push( data );
    }
}
data = tempData;

Theo suy nghĩ của tôi, tất cả điều này sẽ hoạt động, nhưng tôi nhận được một lỗi tempData.pushkhông phải là một chức năng. Tôi hiểu tại sao nó không giống với một mảng, nhưng tôi có thể làm gì khác?


4
Dường như bạn chỉ nên sử dụng một mảng
Esailija

Câu trả lời:


132

push()là dành cho mảng , không phải đối tượng , vì vậy hãy sử dụng đúng cấu trúc dữ liệu.

var data = [];
// ...
data[0] = { "ID": "1", "Status": "Valid" };
data[1] = { "ID": "2", "Status": "Invalid" };
// ...
var tempData = [];
for ( var index=0; index<data.length; index++ ) {
    if ( data[index].Status == "Valid" ) {
        tempData.push( data );
    }
}
data = tempData;

9
+1 đánh bại tôi với nó. Đừng quên thay đổi for...invòng lặp.
Andy E

@MattBall xấu của tôi! Tôi không thực sự thành thạo về SO xem xét và các công cụ! :)
Shouvik

1
Push dành cho mảng, Có cách nào để thêm mảng vào một đối tượng không?
Venkat

1
Còn về mảng kết hợp?
Kinnard Hockenhull

@KinnardHockenhull Tôi xin lỗi, tôi không hiểu câu hỏi. Bạn có thể làm rõ những gì bạn đang yêu cầu?
Matt Ball

17

Đối tượng không hỗ trợ thuộc tính đẩy, nhưng bạn cũng có thể lưu nó bằng cách sử dụng chỉ mục làm khóa,

var tempData = {};
for ( var index in data ) {
  if ( data[index].Status == "Valid" ) { 
    tempData[index] = data; 
  } 
 }
data = tempData;

Tôi nghĩ rằng điều này dễ dàng hơn nếu loại bỏ đối tượng nếu trạng thái của nó không hợp lệ, bằng cách thực hiện.

for(var index in data){
  if(data[index].Status == "Invalid"){ 
    delete data[index]; 
  } 
}

Và cuối cùng, bạn không cần tạo var temp -


Thêm một số giải thích với câu trả lời về cách thức này trả lời giúp đỡ OP trong sửa chữa vấn đề hiện tại
ρяσѕρєя K

5

Bạn phải làm var tempData = new Array();

Đẩy là một hàm Mảng.


9
Tại sao new Array()và không []?
Matt Ball

3
[] là một thay thế (phím tắt) để tạo mảng mới. Nó có thể được tạo với [] và Array () mới.
Alex Dn

6
[]là cách chính để tạo mảng, cách còn lại là các lựa chọn thay thế và thậm chí có thể bị ghi đè.
Esailija

6
Xem stackoverflow.com/questions/885156/... cho một cuộc thảo luận về lý do tại sao new Array()là ác
Jonas Høgh

w3schools.com/js/js_obj_array.asp Mảng mới Mảng là mảng thông thường. Trường hợp [] được xác định là chính?
Alex Dn

3

Ngôn ngữ lập trình Javascript hỗ trợ mô hình lập trình chức năng để bạn có thể thực hiện dễ dàng với các mã này.

var data = [
    {"Id": "1", "Status": "Valid"},
    {"Id": "2", "Status": "Invalid"}
];
var isValid = function(data){
    return data.Status === "Valid";
};
var valids = data.filter(isValid);

2

Tôi giả định rằng THỰC SỰ bạn lấy đối tượng từ máy chủ và muốn nhận đối tượng trên đầu ra

Object.keys(data).map(k=> data[k].Status=='Invalid' && delete data[k])


0
    tempData.push( data[index] );

Tôi đồng ý với câu trả lời đúng ở trên, nhưng .... của bạn vẫn không cung cấp giá trị chỉ mục cho dữ liệu mà bạn muốn thêm vào tempData. Nếu không có giá trị [chỉ số], toàn bộ mảng sẽ được thêm vào.


Hãy trình bày chi tiết cách giải quyết vấn đề. Cảm ơn.
Leonid Glanz

Điều này sẽ sửa lại câu trả lời được chấp nhận từ Matt Ball. Khi chúng ta đang lặp lại dữ liệu, chúng ta chỉ nên đẩy dữ liệu [chỉ mục], không phải toàn bộ dữ liệu.
Jonathan Bergeron

-2

Làm:


var data = new Array();
var tempData = new Array();


4
Tại sao new Array()và không []?
Matt Ball

lưu ý sự khác biệt giữa new Array (); và Mảng mới; Bạn sẽ có thể trả lời những câu hỏi như vậy thay vì nói về các lựa chọn thay thế ..
Jonathan
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.