Mendapatkan daftar kunci objek JavaScript


295

Saya punya objek JavaScript

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

Bagaimana saya bisa mendapatkan panjang dan daftar kunci di objek ini?


kemungkinan duplikat dari Dapatkan Nama Properti Di Objek JSON
TJ

@ TT Saya pikir itu tidak sepenuhnya sama. Ini adalah objek, duplikat adalah objek JSON.
GuyT

jika Anda memiliki garis bawah, maka cukup _.keys (objek_Anda)
minhajul

1
Karena banyak hal telah berubah sejak 2010, mungkin lebih baik untuk menerima jawaban yang paling banyak dipilih sebagai "jawaban"
Jonas Wilms

Jawaban:


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);


Saya tidak mengira Javascript seperti PHP, di mana Anda dapat melewati baris pertama sama sekali? Bukan berarti sesuatu seperti itu disarankan untuk dilakukan.
Bart van Heukelom

@ Bart: Tidak, baris pertama diperlukan dalam JavaScript.
Daniel Vassallo

6
Anda harus melihat komentar David Morrissey di bawah ini untuk kasus tepi di sini. Terkadang mengambil pendekatan ini akan menghasilkan anggota prototipe yang tidak diinginkan muncul keys.

2
@ Pat: Jika Anda menggunakan objek literal, itu hanya akan terjadi jika Anda memperpanjang Object.prototype, yang seharusnya tidak Anda lakukan. Namun, untuk konstruktor khusus, Anda benar.
Sasha Chedygov

@ BartartHeukelom bahkan kembali pada bulan Juni 2010 yang menyebabkan pemberitahuan, karena itu berarti Anda mengetik objek secara implisit. Menetapkannya [](atau array()saat itu) membuatnya menjadi array, yang kemudian dapat Anda gunakan sebagai array dengan aman.
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);

Ini didukung di sebagian besar browser utama sekarang.


7
Fakta bahwa ia bekerja di Chrome juga berarti ia bekerja di Node.js karena keduanya dibangun di atas mesin javascript V8.
Homme Zwaagstra

9
@Mari Sekarang, ya. Dua tahun lalu, tidak banyak.
AlbertEngelB

4
Perhatikan bahwa ini berbeda dari for(key in ob)! Object.keystidak akan mendaftar kunci dari prototipe, tetapi .. in objtidak.
Albert

9
@set windows7 datang dengan IE8. Sebesar apa pun itu, tidak mungkin jawaban ini dapat diterima sampai orang berhenti menggunakan IE8.
Meringkuk

1
Di sini developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Anda menemukan metode JavaScript yang berfungsi dengan benar di browser lama dan tidak menimpa fungsionalitas di browser yang lebih baru. Lihat juga jawaban saya di bawah ini.
Sandro

27

Underscore.js membuat transformasi cukup bersih:

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

Sunting: Saya rindu Anda dapat melakukan ini juga:

var keys = _.keys(x);

Itu benar, sumber garis bawah yang sebenarnya: nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = fungsi (obj, key) {return hasOwnProperty.call (obj, key); }; _.keys = nativeKeys || function (obj) {if (obj! == Obyek (obj)) melempar TypeError baru ('Objek tidak valid'); var keys = []; untuk (var key in obj) if ( .has (obj, key)) keys.push (key); kunci kembali; };
Miguel Alejandro Fuentes Lopez

18

Jika Anda hanya ingin kunci yang spesifik untuk objek tertentu dan bukan prototypeproperti turunan apa pun :

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

misalnya:

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;

untuk mengakses nilai apa pun dari objek, Anda dapat menggunakan objek [kunci];


Anda perlu meningkatkan indeks array
Vivek

indeks array bertambah secara otomatis oleh keys.length, yang berbeda untuk setiap iterasi karena setiap iterasi memasukkan nilai.
KrekkieD

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

Anda dapat mencoba:

[index for (index in obj)] 

ini akan kembali:

['a','b']

untuk mendapatkan daftar kunci atau

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

untuk mendapatkan nilai


Tidak bekerja di Google Chrome v16.0.912.75, tetapi bekerja di Firefox v10.0
RobM

4

Jawaban Anurags pada dasarnya benar. Tetapi untuk mendukung Object.keys(obj)di browser lama juga Anda dapat menggunakan kode di bawah ini yang disalin dari https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys . Ini menambahkan Object.keys(obj)metode jika tidak tersedia dari browser.

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

Perhatikan bahwa dalam naskah kopi ini dapat dilakukan di semua browser dan simpul sebagai

k for k of obj

dan dengan demikian

(1 for _ of obj).length

3

Solusi rekursif untuk browser yang mendukung 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

Jika Anda memutuskan untuk menggunakan Underscore.js sebaiknya Anda lakukan

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

Dalam JavaScript, objek adalah entitas mandiri, dengan properti dan tipe.

Untuk mengambil nilai dari Object dalam bentuk array: Object .values ​​(obj) // obj adalah nama objek yang Anda gunakan Hasil -> ["value1", "value2", "value3", "value4"]

Untuk mengambil kunci dari Object dalam bentuk array: Object .keys (obj) // obj adalah nama objek yang Anda gunakan Hasil -> ["key1", "key2", "key3", "key4"]

Karena kedua fungsi mengembalikan array, Anda bisa mendapatkan panjang kunci atau nilai dengan menggunakan properti length. Misalnya - Object .values ​​(obj) .length atau Object .key (obj) .length


2

Untuk string yang diberi tanda koma yang mencantumkan kunci dari objek JSON, coba yang berikut ini:

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

Menggunakan ES6, Anda dapat menggunakannya forEachuntuk beralih di atas Tombol-tombol Objek. Untuk mendapatkan semua kunci yang bisa Anda gunakan Object.keysyang mengembalikan semua kunci dalam sebuah Objek

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

Tangan pendek dari cuplikan di atas adalah, yang hanya membutuhkan satu parameter

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

1
       if(props.userType){
          var data = []
          Object.keys(props.userType).map(i=>{
                data.push(props.userType[i])
          })
          setService(data)
        }

0

menggunakan slice, apply and join method.

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.