Untuk..Dalam loop dalam JavaScript - pasangan nilai kunci

414

Saya bertanya-tanya apakah ada cara untuk melakukan sesuatu seperti foreachloop PHP di JavaScript. Fungsi yang saya cari adalah sesuatu seperti Potongan PHP ini:

foreach($data as $key => $value) { }

Saya sedang melihat for..inloop JS , tetapi tampaknya tidak ada cara untuk menentukan as. Jika saya melakukan ini dengan 'normal' untuk loop ( for(var i = 0; i < data.length; i++), apakah ada cara untuk mengambil pasangan nilai kunci =>?

kabaret
sumber

Jawaban:

216

Jika Anda dapat menggunakan ES6 secara native atau dengan Babel (js compiler) maka Anda dapat melakukan hal berikut:

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

for (const [key, value] of Object.entries(test)) {
  console.log(key, value);
}

Yang akan mencetak hasil ini:

a 1
b 2
c 3

The Object.entries()Metode mengembalikan array sendiri properti enumerable suatu objek tertentu yang [key, value]pasang, dalam urutan yang sama seperti yang disediakan oleh for...inlingkaran (perbedaan adalah bahwa untuk-sifat lingkaran menyebutkan dalam rantai prototipe juga) .

Semoga ini bisa membantu! =)

Francesco Casula
sumber
1
Ini berfungsi sempurna, hanya ingin tahu - dibandingkan dengan "untuk kunci dalam objek dan kemudian mendapatkan nilai dengan objek [kunci]", yang mana yang memberikan kinerja yang lebih baik?
lsheng
1
Dalam kasus khusus ini saya akan menganggap itu lebih lambat karena Object.entriespanggilan. Saya tidak menjalankan tes apa pun.
Francesco Casula
6
ini adalah jawaban terbaik untuk pertanyaan yang ada, yang bertanya tentang meraih kunci dan nilai pada for loop.
cipak
4
Jawaban yang diterima harus diperbarui karena ini sebenarnya menjawab pertanyaan, meskipun tidak tersedia pada saat pertanyaan.
Marc Qualie
1
Anda mungkin ingin memeriksa pertanyaan ini: stackoverflow.com/questions/47213651/… yang tampaknya menunjukkan bahwa sintaksis jenis ini akan direkomendasikan: Object.keys (myObject) .forEach (key => {...
Will59
519
for (var k in target){
    if (target.hasOwnProperty(k)) {
         alert("Key is " + k + ", value is " + target[k]);
    }
}

hasOwnPropertydigunakan untuk memeriksa apakah Anda targetbenar - benar memiliki properti itu, daripada mewarisinya dari prototipe. Yang sedikit lebih sederhana adalah:

for (var k in target){
    if (typeof target[k] !== 'function') {
         alert("Key is " + k + ", value is" + target[k]);
    }
}

Itu hanya cek yang ktidak metode (seolah-olah targetadalah arrayAnda akan mendapatkan banyak metode waspada, misalnya indexOf, push, pop, dll.)

J0HN
sumber
87
Cara lain untuk beralih hanya pada properti "milik" adalah Object.keys. Object.keys(target).forEach(function (key) { target[key]; });.
katspaugh
3
tidak akan berfungsi jika targetdibuat menggunakan Object.create(null), kode harus diubah target.hasOwnProperty(k)->Object.prototype.hasOwnProperty.call(target,k)
Azder
mengapa tidak menggunakan variabel yang diberikan dalam contoh pertanyaan? Apa yang ada di sini k, targetdan property? Bagi saya, non-javascripter area yang tidak ditentukan ini :)
Gediminas
2
Object.keys (target) .forEach ((key) => {target [key];}); untuk Angular
askilondz
315

Tidak ada yang menyebutkan Object.keysjadi saya akan menyebutkannya.

Object.keys(obj).forEach(function (key) {
   // do something with obj[key]
});
goatslacker
sumber
3
Catatan: Tidak didukung oleh IE8 dan di bawah ini.
Edwin Stoteler
1
Pada titik ini Anda harus menggunakan shim ES5. Jika Anda tinggal di ES6 yang bagus, gunakan for of tc39wiki.calculist.org/es6/for-of
goatslacker
17
Perlu dicatat, bahwa "Tidak ada cara untuk menghentikan atau menghancurkan loop forEach () selain dengan melemparkan pengecualian"
rluks
Object.keys (obj) .forEach ((key) => {}); untuk Angular
askilondz
Itu tidak bekerja pada ES6 atau saya tidak memahaminya. Felix memiliki jawaban yang lebih baik dan lebih mudah dibaca di bawah ini: data.forEach (fungsi (nilai, indeks) {console.log (indeks); // 0, 1, 2 ...});
gtamborero
115

untuk ... di akan bekerja untuk Anda.

for( var key in obj ) {
  var value = obj[key];
}

Dalam JavaScript modern Anda juga dapat melakukan ini:

for ( const [key,value] of Object.entries( obj ) ) {

}
Paul
sumber
64
var obj = {...};
for (var key in obj) {
    var value = obj[key];

}

Sintaks php hanya gula.

Zirak
sumber
Ini juga akan beralih pada semua properti yang diwarisi. Untuk menghindari ini, gunakan .hasOwnProperty ().
LSerni
24

Saya berasumsi Anda tahu itu iadalah kuncinya dan Anda bisa mendapatkan nilai melalui data[i](dan hanya ingin jalan pintas untuk ini).

ECMAScript5 memperkenalkan forEach [MDN] untuk array (sepertinya Anda memiliki array):

data.forEach(function(value, index) {

});

Dokumentasi MDN menyediakan shim untuk browser yang tidak mendukungnya.

Tentu saja ini tidak berfungsi untuk objek, tetapi Anda dapat membuat fungsi serupa untuk mereka:

function forEach(object, callback) {
    for(var prop in object) {
        if(object.hasOwnProperty(prop)) {
            callback(prop, object[prop]);
        }
    }
}

Karena Anda menandai pertanyaan dengan , jQuery menyediakan $.each [docs] yang loop atas struktur array dan objek.

Felix Kling
sumber
Itu Array forEach, bukan objek forEach.
2
Begitu? Rupanya OP berputar di atas array.
Felix Kling
Juga Mozilla (Firefox, SpiderMonkey-C, Rhino & c) memiliki ekstensi non-standar yang memungkinkan for eachsintaksis. for each (let val in myObj) console.log(val);.
katspaugh
2
@katspaugh: Benar, tetapi karena hanya Mozilla, sepertinya tidak terlalu berguna.
Felix Kling
Terima kasih banyak atas jawaban Anda. Saya akan membaca informasi yang Anda berikan. Asumsi Anda pada awal jawaban itu benar, saya tahu itu, kecuali saya mendapatkan begitu banyak di kepala saya dengan proyek ini sehingga saya tidak dapat fokus dan melupakannya .. Terima kasih.
kabaret
10

Anda dapat menggunakan for..inuntuk itu.

for (var key in data)
{
    var value = data[key];
}
Christoph Winkler
sumber
9
for (var key in myMap) {
    if (myMap.hasOwnProperty(key)) {
        console.log("key =" + key);
        console.log("value =" + myMap[key]);
    }
}

Dalam javascript, setiap objek memiliki sekelompok pasangan nilai kunci bawaan yang memiliki informasi meta. Saat Anda menggilir semua pasangan nilai kunci untuk objek yang Anda lewati juga. Penggunaan hasOwnProperty () menyaring ini.

Siddhu
sumber
2

ES6 akan menyediakan Map.prototype.forEach (panggilan balik) yang dapat digunakan seperti ini

myMap.forEach(function(value, key, myMap) {
                        // Do something
                    });
Stephen Murby
sumber
2
untuk apa parameternya myMap?
phil294
Peta bukan objek. Mereka adalah hal yang sepenuhnya terpisah.
Dakusan
2
Fungsi forEach tidak mengandung 'kunci' array tetapi lebih pada indeks elemen yang saat ini Anda iterasi.
Francis Malloch
2
let test = {a: 1, b: 2, c: 3};
Object.entries(test).forEach(([key, value]) => console.log(key, value))

// a 1
// b 2
// c 3
吴毅 凡
sumber
5
Anda dapat menambahkan beberapa penjelasan dengan kode yang Anda posting alih-alih memposting kode biasa yang mungkin tidak dapat dimengerti.
AaoIi
Object.entries tarikan keluar sebuah array dari array berdasarkan pasangan kunci / nilai dari objek asli: [['a', 1],['b',2],['c',3]]. The forEachmendekonstruksi masing-masing kunci / array nilai dan menetapkan dua variabel untuk keydan value, untuk digunakan sebagai yang Anda inginkan dalam fungsi - di sini output dalam console.log.
Mark Swardstrom
1

Anda dapat menggunakan loop 'untuk masuk' untuk ini:

for (var key in bar) {
     var value = bar[key];
}
Richard Dalton
sumber
1

Di bawah ini adalah contoh yang sedekat yang Anda dapatkan.

for(var key in data){
  var value = data[key];    
  //your processing here
}

Jika Anda menggunakan jQuery, lihat: http://api.jquery.com/jQuery.each/

Aidamina
sumber
1

Jika Anda menggunakan Lodash , Anda dapat menggunakan_.forEach

_.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
  console.log(key + ": " + value);
});
// => Logs 'a: 1' then 'b: 2' (iteration order is not guaranteed).
Gil Epshtain
sumber
1

Dalam beberapa tahun terakhir sejak pertanyaan ini dibuat, Javascript telah menambahkan beberapa fitur baru. Salah satunya adalah metode Object.Entries .

Disalin langsung dari MDN adalah cuplikan kode tindak


const object1 = {
  a: 'somestring',
  b: 42
};

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

ya, Anda dapat memiliki array asosiatif juga di javascript:

var obj = 
{
    name:'some name',
    otherProperty:'prop value',
    date: new Date()
};
for(i in obj)
{
    var propVal = obj[i]; // i is the key, and obj[i] is the value ...
}
Alex Pacurar
sumber
@PaulPRO ... semua yang ada di javascript adalah pasangan nilai kunci (dengan demikian, sebuah objek sebenarnya adalah array asosiatif dari pasangan nilai kunci ...)
Alex Pacurar
@AlexPacurar dan array asosiatif memiliki pesanan. Objek tidak terurut. itu perbedaan besar
Raynos
@ Raynos Anda mungkin benar ... itu akan sangat membantu untuk menjelaskan dengan tepat bagaimana sebuah objek tidak diurutkan ... mengingat contoh di atas, orang akan mengharapkan bahwa 'i' dalam loop untuk menjadi [nama, properti lain, dan akhirnya tanggal] ... jadi dalam situasi apa urutan properti suatu objek akan bercampur?
Alex Pacurar
@AlexPacurar urutan tertentu di mana ia akan mengulangi objek adalah browser tertentu. Beberapa melakukannya secara alfabet, beberapa melakukannya dengan urutan definisi, dll
Raynos
3
@ Raynos: Apakah array asosiatif perlu dipesan? Saya sudah sering melihat istilah yang digunakan lebih umum. Sebagai contoh, pada artikel Wikipedia array asosiatif .
Jeremy Banks
-8
var global = (function() {
   return this;
})();

// Pair object, similar to Python

function Pair(key, value) {
    this.key = key;
    this.value = value;

    this.toString = function() {
       return "(" + key + ", " + value + ")";
    };
}

/**
 * as function
 * @param {String} dataName A String holding the name of your pairs list.
 * @return {Array:Pair} The data list filled
 *    with all pair objects.
 */
Object.prototype.as = function(dataName) {
    var value, key, data;
    global[dataName] = data = [];

    for (key in this) {
       if (this.hasOwnProperty(key)) {
          value = this[key];

          (function() {
             var k = key,
                 v = value;

            data.push(new Pair(k, v));
          })();
       }
    }

    return data;
};

var d = {
   'one': 1,
   'two': 2
};

// Loop on your (key, list) pairs in this way
for (var i = 0, max = d.as("data").length; i < max; i += 1) {
   key = data[i].key;
   value = data[i].value;

   console.log("key: " + key + ", value: " + value);
}

// delete data when u've finished with it.
delete data;
pengguna278064
sumber