ฉันจะยกเลิกการตั้งค่าองค์ประกอบในอาร์เรย์ในจาวาสคริปต์ได้อย่างไร


คำตอบ:


243

อย่าใช้การลบเนื่องจากมันจะไม่ลบองค์ประกอบออกจากอาเรย์เท่านั้นมันจะตั้งค่าเป็นไม่ได้กำหนดเท่านั้นซึ่งจะไม่ถูกสะท้อนอย่างถูกต้องในความยาวของอาเรย์

หากคุณรู้ว่ากุญแจคุณควรใช้ประกบกันเช่น

myArray.splice(key, 1);

สำหรับคนที่อยู่ในตำแหน่งของสตีเวนคุณสามารถลองสิ่งนี้:

for (var key in myArray) {
    if (key == 'bar') {
        myArray.splice(key, 1);
    }
}

หรือ

for (var key in myArray) {
    if (myArray[key] == 'bar') {
        myArray.splice(key, 1);
    }
}


3
@ThiefMaster - สนใจอธิบายหรือไม่ ฉันไม่รู้ว่าหมายถึงอะไรและกระตือรือร้นที่จะเรียนรู้ เช่นเคยการแก้ไขดีกว่าความคิดเห็นนอกมือ 1,000,000 เท่า คุณควรรู้ด้วยจำนวนตัวแทนที่คุณมี
ไป

21
ใช้for (var key in myArray)แทนfor (key in myArray)- มิฉะนั้นkeyจะเป็นตัวแปรโกลบอลและถ้าคุณเรียกใช้ฟังก์ชันภายในลูปนั้นที่มีปัญหาเดียวกันคุณจะได้ผลลัพธ์ที่ไม่คาดคิด
ThiefMaster

2
หมายเหตุตัวอย่างที่สองไม่ทำงานหากอาร์เรย์มีหลายรายการในแถวที่ตรงกับ 'บาร์' ดัชนีของอาร์เรย์จะเปลี่ยนและคุณจะพลาดการต่อเชื่อมครึ่งหนึ่งของรายการ ให้ใช้ a for loop ที่ลดดัชนีเมื่อพบการแข่งขัน
Dave Lancea

สำหรับอาร์เรย์ของวัตถุ: stackoverflow.com/questions/15287865/…
Fedir RYKHTIK

52
delete foo[key];

: D


4
ในทางเทคนิคที่ไม่ตอบคำถาม เขากำลังมองหาการลบคีย์ 'บาร์' และตัวแปรหลักของคุณไม่ได้แปลว่า : P
Kon

4
ที่สำคัญ = 'บาร์'; eval ("ลบ foo." + แป้น); กลอง ; D
olliej

3
อย่าไม่evalใช้ การลบคีย์ / ดัชนีของวัตถุ / evalอาร์เรย์สามารถทำได้โดยวิธีการที่ง่ายมากไม่ได้ใช้
Dinei

4
ที่จริงแล้วถ้าคุณลบออกจากอาร์เรย์ที่จัดทำดัชนีโดยการลบ foo [กุญแจ] มันจะเก็บค่าใน foo [key] = ไม่ได้กำหนดและ foo.length จะยังคงเหมือนเดิมซึ่งเป็นสิ่งที่ผิด ดังนั้นใช้ SPLICE แทน
ПавелИванов

ใช้ delete foo [key] ผิด ควรใช้ foo.splice (รหัส 1);
vnguyen

38

หมายเหตุสำคัญ: อาร์เรย์ JavaScript ไม่ใช่อาร์เรย์เชื่อมโยงเหมือนกับที่คุณคุ้นเคยจาก PHP หาก "คีย์อาร์เรย์" ของคุณเป็นสตริงแสดงว่าคุณไม่ได้ใช้งานเนื้อหาของอาร์เรย์อีกต่อไป อาร์เรย์ของคุณเป็นวัตถุและคุณใช้เครื่องหมายวงเล็บเพื่อเข้าถึงสมาชิกชื่อ <key name> ดังนั้น:

var myArray = [];
myArray ["bar"] = จริง;
myArray ["foo"] = จริง;
การแจ้งเตือน (myArray.length); // คืนค่า 0

เนื่องจากคุณยังไม่ได้เพิ่มองค์ประกอบลงในอาร์เรย์คุณจึงปรับเปลี่ยนเฉพาะแถบและสมาชิก foo ของ myArray


37

หากคุณรู้ชื่อกุญแจก็ทำได้ดังนี้

delete array['key_name']

2
นี่ไม่ใช่อาร์เรย์! มันเป็นวัตถุ (ใช่สิ่งเหล่านี้เรียกว่าอาเรย์แบบเชื่อมโยงใน JS แต่ไม่ใช่พวกมันไม่ได้จริงและวิธีนี้จะเป็นอันตรายหากคุณใช้งานร่วมกับอาเรย์ JS อย่างจริงจัง
wintercounter

3

นี่คือวิธีที่ฉันจะทำมัน

 myArray.splice( myArray.indexOf('bar') , 1) 

1
กระบวนการ Array.prototype.indexOf () ค้นหาค่าภายในอาร์เรย์ไม่ใช่คีย์ ดังนั้นสิ่งนี้จะไม่ทำงาน
Nadav

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