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.