Bagaimana cara mendapatkan semua nilai properti dari Objek JavaScript (tanpa mengetahui kunci)?

Jawaban:

447

Dengan menggunakan for..inloop sederhana :

for(var key in objects) {
    var value = objects[key];
}
Tatu Ulmanen
sumber
90
Hati-hati dengan properti objek prototipe yang diwarisi. Lihat: hasOwnProperty ()
zaitun
102
Jika Anda membaca jawaban ini, Anda pasti harus membaca yang lain
mgarciaisaia
18
Jika Anda membaca jawaban ini dan Anda mungkin berurusan dengan string, Anda harus memukulkan javascript di wajahnya.
Jika Anda membaca jawaban di atas dan ingin meninju JavaScript di wajahnya, coba lodash
slugmandrew
Mungkin harus menunjukkan bahwa ini TIDAK akan menyertakan properti yang enumerableflagnya disetel ke false. Ini - antara lain - berarti Anda tidak akan mengulangi metode kelas apa pun, tetapi Anda akan beralih menggunakan metode yang dibuat dengan cara lain.
kaya remer
1012

Bergantung pada browser mana yang harus Anda dukung, ini dapat dilakukan dengan beberapa cara. Mayoritas browser yang ada di wild mendukung ECMAScript 5 (ES5), tetapi perlu diingatkan bahwa banyak contoh di bawah ini digunakan Object.keys, yang tidak tersedia di IE <9. Lihat tabel kompatibilitas .

ECMAScript 3+

Jika Anda harus mendukung versi IE yang lebih lama, maka ini adalah opsi untuk Anda:

for (var key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
        var val = obj[key];
        // use val
    }
}

Bersarang ifmemastikan bahwa Anda tidak menyebutkan properti dalam rantai prototipe objek (yang merupakan perilaku yang hampir pasti Anda inginkan). Anda harus menggunakan

Object.prototype.hasOwnProperty.call(obj, key) // ok

daripada

obj.hasOwnProperty(key) // bad

karena ECMAScript 5+ memungkinkan Anda membuat objek tanpa prototipe Object.create(null) , dan objek ini tidak akan memiliki hasOwnPropertymetode. Kode nakal juga dapat menghasilkan objek yang menimpa hasOwnPropertymetode ini.

ECMAScript 5+

Anda dapat menggunakan metode ini di browser apa pun yang mendukung ECMAScript 5 dan di atasnya. Ini mendapatkan nilai dari suatu objek dan menghindari penghitungan di atas rantai prototipe. Di mana objobjek Anda:

var keys = Object.keys(obj);

for (var i = 0; i < keys.length; i++) {
    var val = obj[keys[i]];
    // use val
}

Jika Anda menginginkan sesuatu yang sedikit lebih kompak atau Anda ingin berhati-hati dengan fungsi dalam loop, maka Array.prototype.forEachadalah teman Anda:

Object.keys(obj).forEach(function (key) {
    var val = obj[key];
    // use val
});

Metode selanjutnya membangun array yang berisi nilai-nilai objek. Ini nyaman untuk diulang.

var vals = Object.keys(obj).map(function (key) {
    return obj[key];
});

// use vals array

Jika Anda ingin membuat mereka yang menggunakan Object.keysaman terhadap null(sebagaimana for-inadanya), maka Anda dapat melakukannyaObject.keys(obj || {})... .

Object.keysmengembalikan properti enumerable . Untuk beralih pada objek sederhana, ini biasanya cukup. Jika Anda memiliki sesuatu dengan properti non-enumerable yang perlu Anda kerjakan, Anda dapat menggunakanObject.getOwnPropertyNames sebagai gantinya Object.keys.

ECMAScript 2015+ (AKA ES6)

Array lebih mudah untuk diulang dengan ECMAScript 2015. Anda dapat menggunakan ini untuk keuntungan Anda saat bekerja dengan nilai satu-per-satu dalam satu lingkaran:

for (const key of Object.keys(obj)) {
    const val = obj[key];
    // use val
}

Menggunakan fungsi panah gemuk ECMAScript 2015, memetakan objek ke array nilai menjadi satu-liner:

const vals = Object.keys(obj).map(key => obj[key]);

// use vals array

ECMAScript 2015 memperkenalkan Symbol, contoh yang dapat digunakan sebagai nama properti. Untuk mendapatkan simbol dari objek yang akan disebutkan, gunakan Object.getOwnPropertySymbols(fungsi ini adalah mengapa Symbol tidak dapat digunakan untuk membuat properti pribadi). ReflectAPI baru dari ECMAScript 2015 menyediakanReflect.ownKeys , yang mengembalikan daftar nama properti (termasuk yang non-enumerable) dan simbol.

Pemahaman array (jangan coba-coba menggunakan)

Pemahaman array telah dihapus dari ECMAScript 6 sebelum publikasi. Sebelum dihapus, solusi akan terlihat seperti:

const vals = [for (key of Object.keys(obj)) obj[key]];

// use vals array

ECMAScript 2017+

ECMAScript 2016 menambahkan fitur yang tidak memengaruhi subjek ini. Spesifikasi ECMAScript 2017 menambahkan Object.valuesdan Object.entries. Keduanya mengembalikan array (yang akan mengejutkan bagi sebagian orang mengingat analogi dengan Array.entries). Object.valuesdapat digunakan apa adanya atau dengan for-ofloop.

const values = Object.values(obj);

// use values array or:

for (const val of Object.values(obj)) {
    // use val
}

Jika Anda ingin menggunakan kunci dan nilainya, itu Object.entriesuntuk Anda. Ini menghasilkan array yang diisi dengan [key, value]pasangan. Anda dapat menggunakan ini sebagaimana adanya, atau (perhatikan juga penugasan perusakan ECMAScript 2015) dalam satu for-oflingkaran:

for (const [key, val] of Object.entries(obj)) {
    // use key and val
}

Object.values shim

Akhirnya, sebagaimana dicatat dalam komentar dan oleh teh_senaus dalam jawaban lain, mungkin layak menggunakan salah satunya sebagai shim. Jangan khawatir, berikut ini tidak mengubah prototipe, itu hanya menambah metode Object(yang jauh lebih berbahaya). Menggunakan fungsi panah gemuk, ini dapat dilakukan dalam satu baris juga:

Object.values = obj => Object.keys(obj).map(key => obj[key]);

yang sekarang dapat Anda gunakan seperti

// ['one', 'two', 'three']
var values = Object.values({ a: 'one', b: 'two', c: 'three' });

Jika Anda ingin menghindari pencukuran ketika orang asli Object.valuesada, maka Anda dapat melakukannya:

Object.values = Object.values || (obj => Object.keys(obj).map(key => obj[key]));

Akhirnya...

Waspadai peramban / versi yang perlu Anda dukung. Di atas adalah benar di mana metode atau fitur bahasa diimplementasikan. Misalnya, dukungan untuk ECMAScript 2015 dimatikan secara default di V8 hingga baru-baru ini, yang mendukung browser seperti Chrome. Fitur-fitur dari ECMAScript 2015 harus dihindari sampai browser yang Anda maksud mendukung implementasi fitur-fitur yang Anda butuhkan. Jika Anda menggunakan babel untuk mengkompilasi kode Anda ke ECMAScript 5, maka Anda memiliki akses ke semua fitur dalam jawaban ini.

qubyte
sumber
9
Ini harus menjadi jawaban yang diterima (atau paling tidak lebih tervvotasikan) karena jawaban yang diterima tidak lengkap (@munculkan poin ini).
0xc0de
Sayang sekali dari semua yang disebut trik, kita masih perlu menyebutkan objdua kali. Saya kira membuat fungsi pembantu tidak dapat dihindari? Sesuatu seperti nilai (obj).
Steven Haryanto
Semua metode ini dapat digunakan sebagai shim. Misalnya:Object.values = obj => Object.keys(obj).map(key => obj[key]);
qubyte
1
Solusi ECMA 5 harus bekerja di semua browser modern. ECMA 6 belum selesai, dan dukungan merupakan pendahuluan di semua browser. Di Chrome, ECMA 6 diimplementasikan sebagian tetapi dinonaktifkan. Di Firefox, dukungan lebih baik tetapi pemahaman array salah (seperti yang disebutkan). Saya pikir penggunaan masa depan saya akan menyiratkan ini. @ JacekLampart, solusi mana yang memberi Anda kesalahan?
qubyte
2
Saya tidak bisa membayangkan mengapa kita harus menunggu ES2017 untuk mendapatkan metode Object.values ​​().
Herbertusz
31

Berikut adalah fungsi yang dapat digunakan kembali untuk memasukkan nilai ke dalam array. Dibutuhkan juga prototipe.

Object.values = function (obj) {
    var vals = [];
    for( var key in obj ) {
        if ( obj.hasOwnProperty(key) ) {
            vals.push(obj[key]);
        }
    }
    return vals;
}
teh_senaus
sumber
15
Memodifikasi Objecttidak banyak masalah ( Object.keysadalah masalah umum), Anda mungkin berpikir untuk memodifikasi prototipe Obyek.
sandstrom
Mengapa Anda perlu mengujinya hasOwnProperty()? Bagaimana kuncinya diulang dalam loop dari objek yang tidak memiliki properti?
1252748
4
Google it @ thomas, ini penting. Mungkin memiliki properti dari rantai prototipe.
Joe
28

Jika Anda memiliki akses ke Underscore.js, Anda dapat menggunakan _.valuesfungsi seperti ini:

_.values({one : 1, two : 2, three : 3}); // return [1, 2, 3]
jichi
sumber
@MathieuAmiot - peduli untuk menjelaskan?
Paden
lodash adalah pengganti yang kompatibel dengan api untuk garis bawah, yang (lebih cepat).
Mathieu Amiot
@ Paden inilah pertanyaan terkait pada SO: stackoverflow.com/questions/13789618/…
jichi
2
lodash tidak perlu untuk ini dan akan mengasapi basis kode Anda
dman
14

Jika Anda benar-benar menginginkan array Nilai, saya menemukan ini lebih bersih daripada membangun array dengan for ... in loop.

ECMA 5.1+

function values(o) { return Object.keys(o).map(function(k){return o[k]}) }

Perlu dicatat bahwa dalam kebanyakan kasus Anda tidak benar-benar membutuhkan array nilai, akan lebih cepat untuk melakukan ini:

for(var k in o) something(o[k]);

Ini beralih pada kunci Objek o. Dalam setiap iterasi k diatur ke kunci o.

zzz
sumber
9

ES5 Object.keys

var a = { a: 1, b: 2, c: 3 };
Object.keys(a).map(function(key){ return a[key] });
// result: [1,2,3]
MrBii
sumber
3
Mengapa ini diturunkan? Saya akan mengatakan bahwa ini adalah salah satu solusi terbersih.
Sebastian Hojas
Saya tidak tahu, mengapa down ini dipilih. Ini adalah solusi termudah dan paling murni dalam js tanpa menggunakan perpustakaan atau utilitas lain apa pun.
sanjeev shetty
5

Anda dapat memutar melalui tombol:

foo = {one:1, two:2, three:3};
for (key in foo){
    console.log("foo["+ key +"]="+ foo[key]);
}

akan menampilkan:

foo[one]=1
foo[two]=2
foo[three]=3
ariera
sumber
2
Anda juga perlu memeriksa `hasOwnProperty () 'jika Anda ingin menghindari atribut bawaan.
0xc0de
3

Untuk orang-orang yang beradaptasi awal di era CofeeScript, berikut ini adalah persamaan lain untuk itu.

val for key,val of objects

Yang mungkin lebih baik dari ini karena objectsdapat dikurangi untuk diketik lagi dan mengurangi keterbacaan.

objects[key] for key of objects
Ch.Idea
sumber
3

gunakan polyfill seperti:

if(!Object.values){Object.values=obj=>Object.keys(obj).map(key=>obj[key])}

lalu gunakan

Object.values(my_object)

3) keuntungan!

pengguna40521
sumber
2

Rupanya - seperti yang baru saya pelajari - ini adalah cara tercepat untuk melakukannya:

var objs = {...};
var objKeys = Object.keys(obj);
for (var i = 0, objLen = objKeys.length; i < objLen; i++) {
    // do whatever in here
    var obj = objs[objKeys[i]];
}
dylnmc
sumber
dapatkah Anda menaruh codepen atau jsfiddle dari contoh ini? Terima kasih.
Chris22
2

Pertanyaannya tidak menentukan apakah ingin properti yang diwarisi dan tidak dapat dihitung juga.

Ada pertanyaan untuk mendapatkan semuanya, properti yang diwarisi dan properti yang tidak dapat dihitung juga , yang tidak dapat dengan mudah ditemukan oleh Google.

Solusi saya untuk itu adalah:

function getAllPropertyNames(obj) {
    let result = new Set();
    while (obj) {
        Object.getOwnPropertyNames(obj).forEach(p => result.add(p));
        obj = Object.getPrototypeOf(obj);
    }
    return [...result];
}

Dan kemudian beralih di atasnya, cukup gunakan for-of loop:

nonopolaritas
sumber
1

Menggunakan: Object.values() :, kami meneruskan objek sebagai argumen dan menerima array nilai sebagai nilai balik.

Ini mengembalikan array dari objek tertentu yang memiliki nilai properti enumerable. Anda akan mendapatkan nilai yang sama dengan menggunakan for inloop tetapi tanpa properti pada Prototipe. Contoh ini mungkin akan membuat segalanya lebih jelas:

function person (name) {
  this.name = name;
}

person.prototype.age = 5;

let dude = new person('dude');

for(let prop in dude) {
  console.log(dude[prop]);     // for in still shows age because this is on the prototype
}                              // we can use hasOwnProperty but this is not very elegant

// ES6 + 
console.log(Object.values(dude));
// very concise and we don't show props on prototype

Willem van der Veen
sumber
1
const object1 = {
  a: 'somestring',
  b: 42
};

for (let [key, value] of Object.entries(object1)) {
  console.log(`${key}: ${value}`);
}

// expected output:
// "a: somestring"
// "b: 42"
// order is not guaranteed
priya_21
sumber
0

Berikut fungsi yang mirip dengan array_values ​​PHP ()

function array_values(input) {
  var output = [], key = '';
  for ( key in input ) { output[output.length] = input[key]; }
  return output;
}

Berikut cara mendapatkan nilai objek jika Anda menggunakan ES6 atau lebih tinggi:

Array.from(values(obj));
jaggedsoft
sumber
Untuk beberapa alasan, nilai () berfungsi di Chrome dan Firefox, tetapi tidak pada iojs / node.
jaggedsoft
0

Kompatibel dengan ES7 bahkan beberapa browser belum mendukungnya

Karena, Object.values(<object>)akan built-in di ES7 &

Sampai menunggu semua browser untuk mendukungnya, Anda dapat membungkusnya di dalam suatu fungsi:

Object.vals=(o)=>(Object.values)?Object.values(o):Object.keys(o).map((k)=>o[k])

Kemudian :

Object.vals({lastname:'T',firstname:'A'})
 // ['T','A']

Setelah browser menjadi kompatibel dengan ES7, Anda tidak perlu mengubah apa pun dalam kode Anda.

Abdennour TOUMI
sumber
0

Saya sadar saya sedikit terlambat tetapi ini adalah shim untuk Object.valuesmetode firefox 47 yang baru

Object.prototype.values = Object.prototype.values || function(obj) {
  return this.keys(obj).map(function(key){
    return obj[key];
  });
};
Jamie
sumber
0

Object.entries melakukannya dengan cara yang lebih baik.

  var dataObject = {"a":{"title":"shop"}, "b":{"title":"home"}}
 
   Object.entries(dataObject).map(itemArray => { 
     console.log("key=", itemArray[0], "value=", itemArray[1])
  })

Mustkeem K
sumber
0

const myObj = { a:1, b:2, c:3 }

Dapatkan semua nilai:

  • cara terpendek:

    • const myValues = Object.values(myObj)
  • const myValues = Object.keys(myObj).map(key => myObj[key])

Anatoliy_Z
sumber
-1
var objects={...}; this.getAllvalues = function () {
        var vls = [];
        for (var key in objects) {
            vls.push(objects[key]);
        }
        return vls;
    }
Sudarshan
sumber
-5

dalam penggunaan ECMAScript5

 keys = Object.keys(object);

Kalau tidak, jika peramban Anda tidak mendukungnya, gunakan yang terkenal for..in loop

for (key in object) {
    // your code here
}
pengguna278064
sumber
17
Pertanyaannya adalah menanyakan nilai, bukan kunci.
zachelrath
@ zachelrath Anda benar. - Tetapi skrip ini berguna jika Anda ingin mendapatkan nilai karena ketika Anda tahu kunci yang dapat Anda gunakan object[key]untuk mendapatkan nilai dalam satu lingkaran.
fridojet
2
@fridojet Tapi itu bisa dilakukan dengan for..in(dan hasOwnProperty) sehingga tidak benar-benar mendapatkan apa-apa .. Saya berharap ECMAScript ke-5 didefinisikan Object.pairs(dan Object.itemsuntuk [[key, value], ..]), tapi sayangnya, tidak.
user2246674
-8

Sekarang saya menggunakan Dojo Toolkit karena browser lama tidak mendukung Object.values.

require(['dojox/lang/functional/object'], function(Object) {
    var obj = { key1: '1', key2: '2', key3: '3' };
    var values = Object.values(obj);
    console.log(values);
});

Keluaran:

['1', '2', '3']
rio
sumber
5
Sebenarnya, array tidak benar. Anda memiliki larik string, bukan larik angka.
qubyte
-10

menggunakan

console.log(variable)

dan jika Anda menggunakan google chrome buka Konsol dengan menggunakan Ctrl + Shift + j

Goto >> Konsol

Puneet
sumber