รับรายการคีย์อ็อบเจ็กต์ JavaScript


295

ฉันมีวัตถุ JavaScript เช่น

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

ฉันจะรับความยาวและรายการคีย์ในวัตถุนี้ได้อย่างไร


เป็นไปได้ที่ซ้ำกันของการรับชื่อคุณสมบัติใน JSON Objects
TJ

@TJ ฉันคิดว่ามันไม่เหมือนกันทั้งหมด นี่คือวัตถุ, ซ้ำกันเป็นวัตถุ JSON
GuyT

หากคุณมีขีดล่างเพียงแค่ _.keys (your_object) ของคุณ
minhajul

1
เมื่อสิ่งต่าง ๆ เปลี่ยนไปตั้งแต่ปี 2010 มันอาจเป็นการดีกว่าที่จะยอมรับคำตอบที่ขึ้นชื่อว่าเป็น "คำตอบ"
Jonas Wilms

คำตอบ:


341

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
};
var keys = [];

for (var k in obj) keys.push(k);

alert("total " + keys.length + " keys: " + keys);


ฉันไม่คิดว่า Javascript เหมือนกับ PHP ซึ่งคุณสามารถข้ามบรรทัดแรกไปได้ทั้งหมด? ไม่ว่าสิ่งที่ชอบที่แนะนำให้ทำต่อไป
Bart van Heukelom

@Bart: ไม่บรรทัดแรกจำเป็นใน JavaScript
Daniel Vassallo

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

2
@pat: หากคุณใช้ตัวอักษรของวัตถุสิ่งนั้นจะเกิดขึ้นเฉพาะเมื่อคุณขยายObject.prototypeซึ่งคุณไม่ควรทำเช่นนั้น อย่างไรก็ตามสำหรับผู้สร้างที่กำหนดเองคุณคิดถูก
Sasha Chedygov

@BartvanHeukelom แม้จะกลับมาในเดือนมิถุนายน 2010 ที่ทำให้เกิดการแจ้งเตือนเพราะมันหมายความว่าคุณกำลังพิมพ์วัตถุโดยปริยาย การกำหนด[]ให้มัน (หรือarray()ย้อนกลับไป) ทำให้มันเป็นอาร์เรย์ซึ่งคุณสามารถใช้เป็นอาร์เรย์ได้อย่างปลอดภัย
Niels Keurentjes

627

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}
var keys = Object.keys(obj);
console.log('obj contains ' + keys.length + ' keys: '+  keys);

ตอนนี้มันรองรับเบราว์เซอร์หลัก ๆ แล้ว


7
ความจริงที่ว่ามันใช้งานได้ใน Chrome ยังหมายความว่ามันใช้งานได้ใน Node.js เนื่องจากทั้งคู่สร้างขึ้นจากเครื่องมือ V8 javascript
Homme Zwaagstra

9
@fet ทุกวันนี้ใช่แล้ว สองปีที่แล้วไม่มาก
AlbertEngelB

4
โปรดทราบว่านี่แตกต่างจากfor(key in ob)! Object.keysจะไม่แสดงรายการคีย์จากต้นแบบ แต่.. in objทำ
อัลเบิร์ต

9
@fet windows7 มาพร้อมกับ IE8 ยอดเยี่ยมอย่างที่มันเป็นไม่มีวิธีนี้เป็นคำตอบที่ยอมรับได้จนกว่าผู้คนจะหยุดใช้ IE8
snuggles

1
ที่นี่developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ......คุณจะพบวิธี JavaScript ที่ทำงานอย่างถูกต้องในเบราว์เซอร์เก่าและไม่เขียนทับฟังก์ชันการทำงานในเบราว์เซอร์รุ่นใหม่ ดูคำตอบของฉันด้านล่าง
Sandro

27

Underscore.js ทำให้การเปลี่ยนแปลงนั้นสะอาด:

var keys = _.map(x, function(v, k) { return k; });

แก้ไข: ฉันพลาดที่คุณสามารถทำได้เช่นกัน:

var keys = _.keys(x);

ถูกต้องแหล่งที่มาขีดเส้นใต้จริง: nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = function (obj, key) {return hasOwnProperty.call (obj, key); }; _.keys = nativeKeys || ฟังก์ชั่น (obj) {ถ้า (obj! == Object (obj)) โยน TypeError ใหม่ ('วัตถุไม่ถูกต้อง'); var keys = []; for (var key in obj) ถ้า ( .has (obj, key)) keys.push (key); ปุ่มส่งคืน; };
Miguel Alejandro Fuentes Lopez

18

หากคุณต้องการคีย์ที่เฉพาะเจาะจงสำหรับวัตถุนั้น ๆ และไม่ใช่prototypeคุณสมบัติที่ได้รับ:

function getKeys(obj) {
    var r = []
    for (var k in obj) {
        if (!obj.hasOwnProperty(k)) 
            continue
        r.push(k)
    }
    return r
}

เช่น:

var keys = getKeys({'eggs': null, 'spam': true})
var length = keys.length // access the `length` property as usual for arrays

4
var keys = new Array();
for(var key in obj)
{
   keys[keys.length] = key;
}

var keyLength = keys.length;

ในการเข้าถึงค่าใด ๆ จากวัตถุคุณสามารถใช้ obj [กุญแจ];


คุณต้องเพิ่มดัชนีอาร์เรย์
Vivek

ดัชนีอาร์เรย์จะเพิ่มขึ้นโดยอัตโนมัติkeys.lengthซึ่งจะแตกต่างกันสำหรับการทำซ้ำแต่ละครั้งเนื่องจากการทำซ้ำแต่ละครั้งจะแทรกค่า
KrekkieD

4
obj = {'a':'c','b':'d'}

คุณสามารถลอง:

[index for (index in obj)] 

สิ่งนี้จะกลับมา:

['a','b']

เพื่อรับรายการคีย์หรือ

[obj[index] for (index in obj)]

เพื่อรับค่า


ไม่ทำงานใน Google Chrome v16.0.912.75 แต่ใช้งานได้ใน Firefox v10.0
RobM

4

คำตอบของ Anurags นั้นถูกต้อง แต่การที่จะสนับสนุนObject.keys(obj)ในเบราว์เซอร์รุ่นเก่าเช่นกันคุณสามารถใช้รหัสด้านล่างที่ถูกคัดลอกจาก https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys มันเพิ่มObject.keys(obj)วิธีการถ้ามันไม่สามารถใช้ได้จากเบราว์เซอร์

if (!Object.keys) {
 Object.keys = (function() {
 'use strict';
 var hasOwnProperty = Object.prototype.hasOwnProperty,
    hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
    dontEnums = [
      'toString',
      'toLocaleString',
      'valueOf',
      'hasOwnProperty',
      'isPrototypeOf',
      'propertyIsEnumerable',
      'constructor'
    ],
    dontEnumsLength = dontEnums.length;

return function(obj) {
  if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
    throw new TypeError('Object.keys called on non-object');
  }

  var result = [], prop, i;

  for (prop in obj) {
    if (hasOwnProperty.call(obj, prop)) {
      result.push(prop);
    }
  }

  if (hasDontEnumBug) {
    for (i = 0; i < dontEnumsLength; i++) {
      if (hasOwnProperty.call(obj, dontEnums[i])) {
        result.push(dontEnums[i]);
      }
    }
  }
  return result;
};
}());
}

3

โปรดทราบว่าใน coffeescript สามารถทำได้ในเบราว์เซอร์และโหนดทั้งหมด

k for k of obj

และดังนั้น

(1 for _ of obj).length

3

โซลูชันแบบเรียกซ้ำสำหรับเบราว์เซอร์ที่รองรับ ECMAScript 5:

var getObjectKeys = function(obj) {
    var keys = Object.keys(obj);
    var length = keys.length;

    if (length !== 0) {
        for (var i = 0; i < length; i++) {
            if (typeof obj[keys[i]] === 'object') {
                keys[keys[i]] = getObjectKeys(obj[keys[i]]);
            }
        }
    }

    return keys;
};

3
var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

console.log(Object.keys(obj));
console.log(Object.keys(obj).length)


3

หากคุณตัดสินใจที่จะใช้ Underscore.js คุณควรทำ

var obj = {
    key1: 'value1',
    key2: 'value2',
    key3: 'value3',
    key4: 'value4'
}

var keys = [];
_.each( obj, function( val, key ) {
    keys.push(key);
});
console.log(keys.lenth, keys);

3

ใน JavaScript วัตถุเป็นเอนทิตีแบบสแตนด์อโลนที่มีคุณสมบัติและประเภท

สำหรับการดึงค่าจาก Object ในรูปแบบของ array: Object .values ​​(obj) // obj เป็นชื่อวัตถุที่คุณใช้ ผลลัพธ์ -> ["value1", "value2", "value3", "value4"]

สำหรับการดึงกุญแจจาก Object ในรูปแบบของ array: Object .key (obj) // obj เป็นชื่อวัตถุที่คุณใช้ ผลลัพธ์ -> ["key1", "key2", "key3", "key4"]

ในขณะที่ฟังก์ชั่นทั้งสองส่งคืนอาร์เรย์คุณสามารถรับความยาวของคีย์หรือค่าโดยใช้คุณสมบัติความยาว ตัวอย่างเช่น - Object .values ​​(obj) .length หรือ Object .keys (obj) .length


2

สำหรับสตริงที่คั่นด้วยเครื่องหมายจุลภาคซึ่งแสดงรายการคีย์ของวัตถุ JSON ให้ลองดังต่อไปนี้:

function listKeys(jObj){
    var keyString = '';
    for(var k in jObj){
        keyString+=(','+k);
    }
    return keyString.slice(1);
}



/* listKeys({'a' : 'foo', 'b' : 'foo', 'c' : 'foo'}) -> 'a,b,c' */

2

ใช้ ES6 คุณสามารถใช้forEachเพื่อทำซ้ำคีย์ของวัตถุ เพื่อรับคีย์ทั้งหมดคุณสามารถใช้Object.keysซึ่งส่งคืนคีย์ทั้งหมดในวัตถุ

Object.keys(obj).forEach(function(keyValue, index, map) { 
  console.log(keyValue); 
});

ตัวอย่างสั้น ๆ ของตัวอย่างด้านบนจะเป็นเพียงพารามิเตอร์เดียวเท่านั้น

Object.keys(obj).forEach(function(keyValue) { 
  console.log(keyValue); 
});


0

ใช้ฝานใช้และเข้าร่วมวิธีการ

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.