Secara dinamis membuat kunci dalam array asosiatif JavaScript

199

Bagaimana saya bisa secara dinamis membuat kunci dalam array asosiatif javascript?

Semua dokumentasi yang saya temukan sejauh ini adalah memperbarui kunci yang sudah dibuat:

 arr['key'] = val;

Saya punya string seperti ini " name = oscar "

Dan saya ingin berakhir dengan sesuatu seperti ini:

{ name: 'whatever' }

Yaitu saya membagi string dan mendapatkan elemen pertama, dan saya ingin memasukkannya ke dalam kamus.

Kode

var text = ' name = oscar '
var dict = new Array();
var keyValuePair = text.split(' = ');
dict[ keyValuePair[0] ] = 'whatever';
alert( dict ); // prints nothing.
OscarRyz
sumber
24
Lompat tautan ke jawaban Eugene untuk kenyamanan
user56reinstatemonica8

Jawaban:

143

Gunakan contoh pertama. Jika kunci tidak ada itu akan ditambahkan.

var a = new Array();
a['name'] = 'oscar';
alert(a['name']);

Akan muncul kotak pesan yang berisi 'oscar'.

Mencoba:

var text = 'name = oscar'
var dict = new Array()
var keyValuePair = text.replace(/ /g,'').split('=');
dict[ keyValuePair[0] ] = keyValuePair[1];
alert( dict[keyValuePair[0]] );
tvanfosson
sumber
Saya menjalankannya sebagai contoh di Firefox hanya untuk memastikan. Apakah Anda memastikan untuk memasukkan 'nama' di tanda kutip?
tvanfosson
1
Uhmm tidak, karena, saya membuat kunci "secara dinamis" tidak statis. Biarkan saya
menggandakan cek
2
Silakan merujuk ke penjelasan Danny yang lebih lengkap. Anda tidak akan dapat merujuk ke nilai array di loop for dengan indeks (seperti myarray [i]). Semoga itu tidak terlalu membingungkan.
MK_Dev
4
Yang lebih baik adalah menggunakan Object (braket {} notation) untuk menghindari overhead memiliki .length, .slice (), dll yang termasuk dalam prototipe Array
bjornl
488

Entah bagaimana semua contoh, saat bekerja dengan baik, terlalu rumit:

  • Mereka menggunakan new Array(), yang merupakan jumlah berlebihan (dan overhead) untuk array asosiatif sederhana (kamus AKA).
  • Yang lebih baik gunakan new Object(). Bekerja dengan baik, tapi mengapa semua ini mengetik ekstra?

Pertanyaan ini ditandai "pemula", jadi mari kita buat sederhana.

Cara sederhana untuk menggunakan kamus di JavaScript atau "Mengapa JavaScript tidak memiliki objek kamus khusus?":

// create an empty associative array (in JavaScript it is called ... Object)
var dict = {};   // huh? {} is a shortcut for "new Object()"

// add a key named fred with value 42
dict.fred = 42;  // we can do that because "fred" is a constant
                 // and conforms to id rules

// add a key named 2bob2 with value "twins!"
dict["2bob2"] = "twins!";  // we use the subscript notation because
                           // the key is arbitrary (not id)

// add an arbitrary dynamic key with a dynamic value
var key = ..., // insanely complex calculations for the key
    val = ...; // insanely complex calculations for the value
dict[key] = val;

// read value of "fred"
val = dict.fred;

// read value of 2bob2
val = dict["2bob2"];

// read value of our cool secret key
val = dict[key];

Sekarang mari kita ubah nilai:

// change the value of fred
dict.fred = "astra";
// the assignment creates and/or replaces key-value pairs

// change value of 2bob2
dict["2bob2"] = [1, 2, 3];  // any legal value can be used

// change value of our secret key
dict[key] = undefined;
// contrary to popular beliefs assigning "undefined" does not remove the key

// go over all keys and values in our dictionary
for (key in dict) {
  // for-in loop goes over all properties including inherited properties
  // let's use only our own properties
  if (dict.hasOwnProperty(key)) {
    console.log("key = " + key + ", value = " + dict[key]);
  }
}

Menghapus nilai juga mudah:

// let's delete fred
delete dict.fred;
// fred is removed, the rest is still intact

// let's delete 2bob2
delete dict["2bob2"];

// let's delete our secret key
delete dict[key];

// now dict is empty

// let's replace it, recreating all original data
dict = {
  fred:    42,
  "2bob2": "twins!"
  // we can't add the original secret key because it was dynamic,
  // we can only add static keys
  // ...
  // oh well
  temp1:   val
};
// let's rename temp1 into our secret key:
if (key != "temp1") {
  dict[key] = dict.temp1; // copy the value
  delete dict.temp1;      // kill the old key
} else {
  // do nothing, we are good ;-)
}
Eugene Lazutkin
sumber
2
Halo, saya tahu saya membalas jawaban lama, tetapi peringkatnya tinggi di Google, jadi saya akan tetap bertanya. Saya agak bingung dengan arti "kami tidak dapat menambahkan kunci rahasia asli karena itu dinamis, kami hanya dapat menambahkan kunci statis" artinya dalam contoh Anda.
Karel Bílek
1
Artinya persis seperti yang dikatakannya: kita tidak tahu nilainya, jadi kita tidak bisa menyatakannya sebagai konstanta, yang diperlukan saat menentukan kunci dalam objek literal.
Eugene Lazutkin
3
Namun, "kami tidak dapat menambahkan kunci rahasia asli karena itu dinamis" tidak benar dengan sendirinya, meskipun Anda tidak dapat menggunakan variabel sebagai kunci secara langsung di {}, atau sebagai kunci dengan notasi titik. Kami masih dapat menambahkan kunci dinamis melalui "dict [key] = val", seperti yang Anda tunjukkan di awal contoh. Batasannya adalah dengan menggunakan {} -notation, daripada kunci itu sendiri.
Zut
8
Ini sepertinya jawaban Sheldon Cooper :)
jpatiaga
4
jawaban lengkap yang sempurna, harus menjadi default
Dennis Golomazov
29

Javascript tidak memiliki array asosiatif , ia memiliki objek .

Baris kode berikut semuanya melakukan hal yang persis sama - setel bidang 'nama' pada objek ke 'orion'.

var f = new Object(); f.name = 'orion';
var f = new Object(); f['name'] = 'orion';
var f = new Array(); f.name = 'orion';
var f = new Array(); f['name'] = 'orion';
var f = new XMLHttpRequest(); f['name'] = 'orion';

Sepertinya Anda memiliki array asosiatif karena Arrayjuga merupakan Object- namun Anda tidak benar-benar menambahkan sesuatu ke dalam array sama sekali, Anda sedang mengatur bidang pada objek.

Sekarang setelah dibersihkan, berikut ini solusi untuk contoh Anda

var text = '{ name = oscar }'
var dict = new Object();

// Remove {} and spaces
var cleaned = text.replace(/[{} ]/g, '');

// split into key and value
var kvp = cleaned.split('=');

// put in the object
dict[ kvp[0] ] = kvp[1];
alert( dict.name ); // prints oscar.
Orion Edwards
sumber
Dengan asumsi string teks benar-benar memiliki kurung kurawal, Anda bisa lebih atau kurang memperlakukannya sebagai JSON .. ganti tanda = dengan: dan Anda punya objek untuk
dieval
1
Ups, string tidak dibatasi dengan benar. Tidak ada regex yang tidak bisa diperbaiki.
neonski
9

Menanggapi MK_Dev, seseorang dapat melakukan iterate, tetapi tidak secara berurutan. (Untuk itu jelas diperlukan array)

Pencarian google cepat memunculkan tabel hash dalam javascript

Kode contoh untuk pengulangan nilai dalam hash (dari tautan tersebut):

var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;

// show the values stored
for (var i in myArray) {
    alert('key is: ' + i + ', value is: ' + myArray[i]);
}
Danny
sumber
5

Kode Asli (saya menambahkan nomor baris sehingga dapat merujuk mereka):

1  var text = ' name = oscar '
2  var dict = new Array();
3  var keyValuePair = text.split(' = ');
4  dict[ keyValuePair[0] ] = 'whatever';
5  alert( dict ); // prints nothing.

Hampir sampai...

  • baris 1: Anda harus melakukannya trimpada teks name = oscar.
  • baris 3: oke selama Anda SELALU memiliki ruang di sekitar Anda sama. mungkin lebih baik untuk tidak trimdi baris 1, gunakan =dan pangkas setiap keyValuePair
  • tambahkan baris setelah 3 dan sebelum 4:

    key = keyValuePair[0];`
  • baris 4: Sekarang menjadi:

    dict[key] = keyValuePair[1];
  • baris 5: Ubah ke:

    alert( dict['name'] );  // it will print out 'oscar'

Apa yang saya coba katakan adalah bahwa dict[keyValuePair[0]]tidak berfungsi, Anda perlu mengatur string keyValuePair[0]dan menggunakannya sebagai kunci asosiatif. Itulah satu-satunya cara saya mendapatkan milik saya untuk bekerja. Setelah mengaturnya, Anda dapat merujuknya dengan indeks numerik atau memasukkan tanda kutip.

Semoga itu bisa membantu.

Andrea
sumber
4

Semua browser modern mendukung Peta , yang merupakan penyempitan data kunci / nilai. Ada beberapa alasan yang menjadikan penggunaan Peta lebih baik daripada Objek:

  • Objek memiliki prototipe, jadi ada kunci default di peta.
  • Kunci dari suatu Objek adalah String, di mana mereka dapat menjadi nilai apa pun untuk Peta.
  • Anda bisa mendapatkan ukuran Peta dengan mudah sementara Anda harus melacak ukuran untuk Obyek.

Contoh:

var myMap = new Map();

var keyObj = {},
    keyFunc = function () {},
    keyString = "a string";

myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

myMap.size; // 3

myMap.get(keyString);    // "value associated with 'a string'"
myMap.get(keyObj);       // "value associated with keyObj"
myMap.get(keyFunc);      // "value associated with keyFunc"

Jika Anda ingin kunci yang tidak dirujuk dari objek lain menjadi sampah yang dikumpulkan, pertimbangkan untuk menggunakan WeakMap alih-alih Peta.

Vitalii Fedorenko
sumber
1
var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;
// show the values stored
for (var i in myArray) {
    alert('key is: ' + i + ', value is: ' + myArray[i]);
}

ini ok tapi beralih melalui setiap properti objek array. jika Anda hanya ingin beralih melalui properti myArray.one, myArray.two ... Anda coba seperti ini

myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;
myArray.push("one");
myArray.push("two");
myArray.push("three");
for(i=0;i<maArray.length;i++{
    console.log(myArray[myArray[i]])
}

sekarang Anda dapat mengakses keduanya dengan myArray ["one"] dan beralih hanya melalui properti ini.

Sasinda Rukshan
sumber
Sudahkah Anda menghitung jumlah kesalahan ketik dalam contoh Anda? :-) maArray, lupa ditutup ')' ...
Brian Haak
Terima kasih untuk contohnya. Kita bisa bersatu Arraydan Objectdan bekerja hanya dengan Objectpohon! Wawasan luar biasa! Sangat berguna untuk membuatnya Object.getOwnPropertyNames(obj/array)!
Brian Haak
1
var obj = {};

                for (i = 0; i < data.length; i++) {
                    if(i%2==0) {
                        var left = data[i].substring(data[i].indexOf('.') + 1);
                        var right = data[i + 1].substring(data[i + 1].indexOf('.') + 1);

                        obj[left] = right;
                        count++;
                    }
                }
                console.log("obj");
                console.log(obj);
                // show the values stored
                for (var i in obj) {
                    console.log('key is: ' + i + ', value is: ' + obj[i]);
                }

            }
        };

}

pengguna2266928
sumber