จะลบรายการตาราง lua ด้วยคีย์ได้อย่างไร?


97

ฉันมีตาราง lua ที่ฉันใช้เป็นแฮชแมปเช่นมีคีย์สตริง:

local map = { foo = 1, bar = 2 }

ฉันต้องการ "ป๊อป" องค์ประกอบของตารางนี้ที่ระบุด้วยคีย์ มีtable.remove()วิธีการหนึ่ง แต่ใช้เพียงดัชนีขององค์ประกอบในการลบ (เช่นตัวเลข) ไม่ใช่คีย์ทั่วไป ฉันต้องการจะทำได้table.remove(map, 'foo')และนี่คือวิธีที่ฉันนำไปใช้:

function table.removekey(table, key)
    local element = table[key]
    table[key] = nil
    return element
end

มีวิธีที่ดีกว่านี้หรือไม่?


4
+1 สำหรับคำถามที่มีประโยชน์เพราะคุณให้ "คำตอบ" ที่ฉันต้องการ แม้ว่าจะไม่มีวิธีที่ "ดีกว่า" ก็ตาม
Ian Boyd

คำตอบ:


84

ไม่การตั้งค่าของคีย์nilเป็นวิธีที่ยอมรับได้ในการลบรายการในส่วนแฮชแมปของตาราง สิ่งที่คุณทำคือมาตรฐาน อย่างไรก็ตามฉันขอแนะนำว่าอย่าลบล้างtable.remove()- สำหรับส่วนอาร์เรย์ของตารางฟังก์ชัน table.remove () เริ่มต้นรวมถึงการจัดลำดับดัชนีใหม่ซึ่งการแทนที่ของคุณจะไม่ทำ หากคุณต้องการเพิ่มฟังก์ชันของคุณลงในtableชุดฟังก์ชันฉันอาจตั้งชื่อให้คล้ายtable.removekey()หรือบางอย่าง


ขอขอบคุณสำหรับความคิดเห็นเกี่ยวกับการลบ เกี่ยวกับชื่อของฟังก์ชั่นนี่คือการทำให้ประเด็นของฉันชัดเจน ฉันมักจะไม่ลบล้างฟังก์ชันมาตรฐาน ฉันจะไม่ใช้มันภายใต้ชื่อนั้นอย่างแน่นอน ( table.removekey()ขอเป็นทางเลือกที่ดีที่สุดด้วย)
Wookai

1
หากคุณใช้งานภายในบล็อกเดียวคุณจะได้ประสิทธิภาพที่ชาญฉลาดยิ่งขึ้นด้วยการทำให้เป็นฟังก์ชันเฉพาะที่แทน (ประหยัดค่าใช้จ่ายในการค้นหาทั่วโลกสำหรับแต่ละการโทร) ผมค่อนข้างบ่อยนำเข้าtable.insertและtable.removeเข้าไปใน namespace ท้องถิ่นถ้าฉันใช้พวกเขาบ่อยครั้งมักจะเป็นสิ่งที่ชอบและtinsert() tremove()
อำพัน

ขอบคุณสำหรับเคล็ดลับประสิทธิภาพ ฉันจะพยายามนำเข้าฟังก์ชั่นที่ฉันใช้บ่อยๆลงในเนมสเปซในเครื่องเพื่อดูว่าสิ่งนี้สร้างความแตกต่างได้มากหรือไม่
Wookai

โปรดทราบว่าคุณควรใช้ table.remove (indez, position) แทนการตั้งค่าเป็นศูนย์ดังนั้นดัชนีจะลดลงและทำให้องค์ประกอบถูกเปลี่ยนตำแหน่ง

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