ฟังก์ชัน Javascript Object push ()


104

ฉันมีวัตถุจาวาสคริปต์ (ฉันได้รับข้อมูลผ่านการร้องขอ ajax):

var data = {};

ฉันได้เพิ่มบางสิ่งเข้าไป:

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

ตอนนี้ฉันต้องการลบวัตถุทั้งหมดที่มีสถานะไม่ถูกต้อง (แต่ให้ทุกอย่างเรียงลำดับเหมือนกัน):

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

ในใจของฉันทั้งหมดนี้น่าจะใช้ได้ แต่ฉันได้รับข้อผิดพลาดที่tempData.pushไม่ใช่ฟังก์ชัน ฉันเข้าใจแล้วว่าทำไมมันถึงไม่เหมือนกับอาร์เรย์ แต่ฉันจะทำอย่างอื่นได้อย่างไร


4
ดูเหมือนว่าคุณควรใช้อาร์เรย์
Esailija

คำตอบ:


134

push()มีไว้สำหรับอาร์เรย์ไม่ใช่วัตถุดังนั้นควรใช้โครงสร้างข้อมูลที่เหมาะสม

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 เอาชนะฉันไปเลย อย่าลืมเปลี่ยนfor...inลูปด้วย
Andy E

@MattBall ฉันเลว! ฉันไม่ค่อยเชี่ยวชาญในการตรวจทานและสิ่งต่าง ๆ ! :)
Shouvik

1
Push ใช้สำหรับอาร์เรย์มีวิธีใดในการเพิ่มอาร์เรย์ให้กับวัตถุหรือไม่?
Venkat

1
แล้ว Associative Array ล่ะ?
Kinnard Hockenhull

@KinnardHockenhull ฉันขอโทษฉันไม่เข้าใจคำถาม คุณช่วยชี้แจงสิ่งที่คุณถามได้ไหม
Matt Ball

18

ออบเจ็กต์ไม่รองรับคุณสมบัติพุช แต่คุณสามารถบันทึกได้เช่นกันโดยใช้ดัชนีเป็นคีย์

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

ฉันคิดว่าสิ่งนี้ง่ายกว่าถ้าลบวัตถุออกหากสถานะไม่ถูกต้องโดยทำ

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

และสุดท้ายคุณไม่จำเป็นต้องสร้างอุณหภูมิตัวแปร -


เพิ่มคำอธิบายพร้อมคำตอบว่าคำตอบนี้ช่วย OP ในการแก้ไขปัญหาปัจจุบันได้อย่างไร
ρяσѕρєя K

5

คุณต้องทำ var tempData = new Array();

Push เป็นฟังก์ชัน Array


9
ทำไมnew Array()ไม่[]?
Matt Ball

3
[] เป็นทางเลือก (ทางลัด) ในการสร้างอาร์เรย์ใหม่ สามารถสร้างได้ด้วย [] และด้วย Array ใหม่ ()
Alex Dn

6
[]เป็นวิธีหลักในการสร้างอาร์เรย์ส่วนอีกทางเลือกหนึ่งและสามารถเขียนทับได้
Esailija

6
ดูstackoverflow.com/questions/885156/…สำหรับการสนทนาว่าทำไมถึงnew Array()ชั่วร้าย
Jonas Høgh

w3schools.com/js/js_obj_array.asp ใหม่ Array คืออาร์เรย์ปกติ [] กำหนดไว้ที่ไหนเป็นหลัก
Alex Dn

3

ภาษาการเขียนโปรแกรม Javascript สนับสนุนกระบวนทัศน์การเขียนโปรแกรมเชิงฟังก์ชันดังนั้นคุณสามารถทำได้อย่างง่ายดายด้วยรหัสเหล่านี้

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

2

ฉันคิดว่าคุณได้รับวัตถุจากเซิร์ฟเวอร์จริงๆและต้องการรับวัตถุในเอาต์พุต

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


0
    tempData.push( data[index] );

ฉันเห็นด้วยกับคำตอบที่ถูกต้องข้างต้น แต่ .... คุณยังไม่ให้ค่าดัชนีสำหรับข้อมูลที่คุณต้องการเพิ่มลงใน tempData หากไม่มีค่า [ดัชนี] อาร์เรย์ทั้งหมดจะถูกเพิ่ม


โปรดอธิบายวิธีแก้ปัญหาโดยละเอียด ขอบคุณ.
Leonid Glanz

นี่จะเป็นการแก้ไขคำตอบที่ยอมรับจาก Matt Ball ในขณะที่เราวนลูปข้อมูลเราควรพุชข้อมูล [ดัชนี] เท่านั้นไม่ใช่ข้อมูลทั้งหมด
Jonathan Bergeron

-2

ทำ:


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


5
ทำไมnew Array()ไม่[]?
Matt Ball

สังเกตความแตกต่างระหว่าง Array ใหม่ (); และอาร์เรย์ใหม่ คุณควรจะตอบคำถามดังกล่าวได้แทนที่จะบอกถึงทางเลือกอื่น ..
โจนาธาน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.