รับรายการของคีย์อาร์เรย์ที่เชื่อมโยง


258

ฉันมีอาเรย์เชื่อมโยงใน Javascript:

var dictionary = {
    "cats": [1,2,3,4,5], 
    "dogs": [6,7,8,9,10]
};

ฉันจะรับกุญแจของพจนานุกรมนี้ได้อย่างไร เช่นฉันต้องการ

var keys = ["cats", "dogs"];

แก้ไข 7 ปีต่อมา: เพียงเพื่อให้ได้คำศัพท์ที่ถูกต้อง - ไม่มีสิ่งใดที่เป็น 'อาเรย์แบบเชื่อมโยง' ใน Javascript - นี่คือเทคนิคเพียงobjectและมันเป็นปุ่มวัตถุที่เราต้องการ


วิธีง่าย ๆ กับ lodash JS - lodash.com/docs#keys
โปรแกรมเมอร์เคมี

ขอบคุณสำหรับการอธิบายคำศัพท์ที่ชัดเจน! คุณสามารถทำให้ใหญ่ขึ้นเล็กน้อยในไฟกะพริบสีแดงสดได้หรือไม่?
Joe Phillips

@ Joe ฉันจะทำให้มันเป็นผลครั้งแรกใน google สำหรับคุณเมื่อฉันได้รับโอกาส
Simon_Weaver

คำตอบ:


84

คุณสามารถใช้ได้: Object.keys(obj)

ตัวอย่าง:

var dictionary = {
  "cats": [1, 2, 37, 38, 40, 32, 33, 35, 39, 36],
  "dogs": [4, 5, 6, 3, 2]
};

// Get the keys
var keys = Object.keys(dictionary);

console.log(keys);

ดูการอ้างอิงด้านล่างสำหรับการสนับสนุนเบราว์เซอร์ รองรับ Firefox 4.20, Chrome 5, IE9 ลิงค์ด้านล่างมีข้อมูลโค้ดที่คุณสามารถเพิ่มได้หากObject.keys()เบราว์เซอร์ของคุณไม่รองรับ

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys


ฉันเปลี่ยนมันเป็นคำตอบที่ยอมรับในขณะนี้ เฉพาะ IE8 เท่านั้นที่ไม่รองรับอีกต่อไป (ซึ่ง polyfill มีให้ใช้งานคือdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

382

ลองสิ่งนี้:

var keys = [];
for (var key in dictionary) {
  if (dictionary.hasOwnProperty(key)) {
    keys.push(key);
  }
}

hasOwnPropertydictionaryเป็นสิ่งจำเป็นเพราะมันเป็นไปได้ที่จะใส่กุญแจลงในวัตถุต้นแบบของ แต่โดยทั่วไปคุณไม่ต้องการให้คีย์เหล่านั้นรวมอยู่ในรายการของคุณ

ตัวอย่างเช่นถ้าคุณทำสิ่งนี้:

Object.prototype.c = 3;
var dictionary = {a: 1, b: 2};

แล้วทำfor...inห่วงกว่าdictionaryคุณจะได้รับaและแต่คุณยังจะได้รับbc


ไม่จำเป็นต้องประกาศ "var keys = []" ยกเว้นว่าคุณต้องการใช้งานหลังจากวนรอบ
mzalazar

2
@mzalazar คุณควรจะทำดีกว่าหรือจะเป็นตัวแปรระดับโลก
b00t

@ b00t ฉันว่าโดยการประกาศตัวแปรภายในสำหรับวง ... มันจะไม่ถูกตั้งค่าในพื้นที่ทั่วโลก ... ตอนนี้คุณทำให้ฉันสงสัย hehe :)
mzalazar

2
@mzalazar แต่คุณไม่ได้ประกาศว่า ( คีย์ ) ที่จุดใด ๆ keys.push(key);ถ้าคุณเพียงแค่ใช้ คุณเพิ่งดึง (และประกาศด้วย) จากเนมสเปซส่วนกลาง :)
b00t

183
for (var key in dictionary) {
  // do something with key
}

มันเป็นคำสั่งสำหรับ ..


1
เพิ่งสังเกตเห็นว่าควรมีลำไส้ใหญ่แทนเครื่องหมายจุลภาคระหว่าง "สุนัข" และอาร์เรย์ด้านบน สมมติว่าเกิดจากการถอดความ
wombleton

68
สิ่งที่สำคัญมากในการตรวจสอบdictionary.hasOwnProperty(key)มิฉะนั้นคุณอาจจะจบลงด้วยวิธีการจากห่วงโซ่ต้นแบบ ..
Tigraine

4
จากบทความเดียวกัน: iterates กว่าคุณสมบัติที่นับของวัตถุในการสั่งซื้อโดยพลการ หากการสั่งซื้อคีย์เป็นสิ่งสำคัญคุณจะต้องทำบางสิ่งเช่นการผลักพวกมันในอาเรย์เรียงลำดับจากนั้นใช้ลูป for () เพื่อรับคีย์จากอาร์เรย์ที่เรียงลำดับซึ่งจะทำดัชนีวัตถุต้นฉบับ
mcmlxxxvi

1
แน่นอนว่ามันมีความยุติธรรมที่จะเพิ่มประสิทธิภาพโดยไม่ใช้พจนานุกรมตรวจสอบว่ามีทรัพย์สินใด ๆ ถ้าคุณมั่นใจได้ว่าวัตถุนั้นไม่มีต้นแบบ แต่สิ่งสำคัญคือต้องตระหนักถึงความเป็นไปได้ของการสืบทอดต้นแบบในบริบทนี้เนื่องจากพจนานุกรม JavaScript เป็นวัตถุจริงๆ
fixermark

16

เพียงแค่บันทึกย่อโปรดระวังการใช้ for..in หากคุณใช้ไลบรารี (jQuery, prototype เป็นต้น ฯลฯ ) เนื่องจากส่วนใหญ่จะเพิ่มวิธีการในการสร้างออบเจ็กต์ (รวมถึงพจนานุกรม)

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


3

วิธี JQUERY ง่าย ๆ

นี่คือสิ่งที่ฉันใช้
DictionaryObj เป็นวัตถุพจนานุกรมจาวาสคริปต์ที่คุณต้องการผ่าน ค่ากุญแจสำคัญของการเป็นชื่อของพวกเขาในพจนานุกรม

 $.each(DictionaryObj, function (key, value) {
            $("#storeDuplicationList")
                .append($("<li></li>")
                .attr("value", key)
                .text(value));
        });

1
ต้องมี jQuery (ซึ่งใช้ได้) แต่คุณลืมที่จะพูดถึง :-)
Simon_Weaver

@Exzile ชื่ออาร์กิวเมนต์ในนิยามฟังก์ชันของคุณสับสนมาก มันบอกว่าที่api.jquery.com/jquery.eachว่าการเรียกกลับเป็น Function (String propertyName, Object valueOfProperty) ชื่อของคุณบ่งบอกถึงการย้อนกลับ
คริส

@ Chris ฉันจะอัปเดตสำหรับคุณ ขอบคุณสำหรับการชี้ให้เห็นว่า
Exzile

0

ฉันใช้การตอบกลับของ Rob de la Cruz

Object.keys(obj)

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

if (!Object.keys) {
    Object.keys = function(object) {
        var keys = [];
        for (var o in object) {
            if (object.hasOwnProperty(o)) {
                keys.push(o);
            }
        }
        return keys;
    };
}

ฉันคิดว่านี่เป็นสิ่งที่ดีที่สุดของทั้งสองโลกสำหรับโครงการขนาดใหญ่: รหัสที่ทันสมัยเรียบง่ายและรองรับการใช้งานย้อนหลังสำหรับเบราว์เซอร์เวอร์ชันเก่าเป็นต้น

อย่างมีประสิทธิภาพมันทำให้การแก้ปัญหาของ JW เป็นฟังก์ชั่นเมื่อ Object.keys (obj) ของ Rob de la Cruz ไม่สามารถใช้ได้

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