Aku ingin mengkonversi sebuah objek seperti ini:
{"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
ke dalam sebuah array dari pasangan kunci-nilai seperti ini:
[[1,5],[2,7],[3,0],[4,0]...].
Bagaimana saya bisa mengkonversi suatu Objek untuk sebuah Array dari pasangan kunci-nilai dalam JavaScript?
Anda dapat menggunakan Objek.kunci-kunci()
dan peta()
untuk melakukan hal ini
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var result = Object.keys(obj).map(function(key) {
return [Number(key), obj[key]];
});
console.log(result);
Cara terbaik adalah untuk melakukan:
var obj ={"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
Object.entries(obj);
Panggilan file
, seperti yang ditunjukkan di sini, akan kembali [key, value]
pasang, sebagai penanya diminta.
Atau, anda bisa menelepon Objek.nilai-nilai(obj)
, yang akan kembali hanya nilai-nilai.
Objek.entri()
mengembalikan array yang elemen array yang sesuai dengan enumerable properti[key, value]
pasang ditemukan secara langsung padaobjek
. Pemesanan sifat yang sama seperti yang diberikan oleh perulangan dari nilai properti dari objek secara manual.
Objek.entri
kembali fungsi hampir output yang tepat anda're meminta, kecuali tombol string bukan angka-angka.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
console.log(Object.entries(obj));
Jika anda membutuhkan kunci berupa angka-angka, anda bisa memetakan hasilnya ke array baru dengan fungsi callback yang menggantikan kunci di masing-masing pasangan dengan nomor dipaksa dari itu.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(input);
return entries.map(entry => Object.assign(entry, { 0: +entry[0] }));
}
console.log(toNumericPairs(obj));
Saya menggunakan panah fungsi dan Objek.menetapkan
untuk peta callback dalam contoh di atas sehingga aku bisa tetap di satu instruksi dengan memanfaatkan fakta bahwa Objek.menetapkan
kembali objek yang ditugaskan untuk, dan satu instruksi panah fungsi's kembali nilai adalah hasil dari instruksi.
Ini setara dengan:
entry => {
entry[0] = +entry[0];
return entry;
}
Seperti yang disebutkan oleh @TravisClarke di komentar, fungsi peta dapat disingkat menjadi:
entry => [ +entry[0], entry[1] ]
Namun, yang akan membuat array baru untuk masing-masing pasangan key-value, bukan memodifikasi array yang ada di tempat, maka dua kali lipat jumlah pasangan key-value array dibuat. Sementara asli entri array masih dapat diakses, dan entri tidak akan menjadi sampah yang dikumpulkan.
Sekarang, meskipun kami menggunakan di tempat metode ini masih menggunakan dua array yang memegang kunci-pasangan nilai (input dan output array), jumlah array hanya berubah sebesar satu. Input dan output array aren't benar-benar diisi dengan array, melainkan referensi ke array dan referensi tersebut mengambil diabaikan jumlah ruang di memori.
Anda bisa pergi satu langkah lebih jauh dan menghilangkan pertumbuhan sama sekali dengan memodifikasi entri menginap di tempat bukan dari pemetaan itu untuk array baru:
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(obj);
entries.forEach(entry => entry[0] = +entry[0]);
return entries;
}
console.log(toNumericPairs(obj));
Untuk rekap beberapa dari jawaban-jawaban ini sekarang di tahun 2018, di mana ES6 adalah standar.
Dimulai dengan objek:
let const={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.values(obj));
//[9,8,7,6,5,4,3,2,1,0,5]
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj));
//[["1",9],["2",8],["3",7],["4",6],["5",5],["6",4],["7",3],["8",2],["9",1],["10",0],["12",5]]
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj).map(([k,v])=>[+k,v]));
//[[1,9],[2,8],[3,7],[4,6],[5,5],[6,4],[7,3],[8,2],[9,1],[10,0],[12,5]]
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj).reduce((ini,[k,v])=>(ini[k]=v,ini),[]));
//[undefined,9,8,7,6,5,4,3,2,1,0,undefined,5]
Metode ini terakhir, bisa juga membenahi fasilitas order tergantung nilai dari kunci. Kadang-kadang hal ini bisa menjadi perilaku yang diinginkan (kadang-kadang don't). Tetapi keuntungan sekarang adalah bahwa nilai-nilai yang diindeks pada yang benar array slot, penting dan sepele untuk melakukan pencarian di atasnya.
Akhirnya (bukan bagian dari pertanyaan awal, tapi untuk kelengkapan), jika anda perlu untuk pencarian mudah menggunakan kunci atau nilai, tapi anda don't ingin sparse array, tidak ada duplikat dan tidak ada penataan kembali tanpa perlu mengkonversi ke tombol angka (bahkan bisa akses sangat kompleks tombol), maka array (atau objek) bukan apa yang anda butuhkan. Saya akan merekomendasikan Peta
sebagai gantinya:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
let r=new Map(Object.entries(obj));
r.get("4"); //6
r.has(8); //true
Menggunakan Objek.tombol
dan Array#peta
metode.
var obj = {
"1": 5,
"2": 7,
"3": 0,
"4": 0,
"5": 0,
"6": 0,
"7": 0,
"8": 0,
"9": 0,
"10": 0,
"11": 0,
"12": 0
};
// get all object property names
var res = Object.keys(obj)
// iterate over them and generate the array
.map(function(k) {
// generate the array element
return [+k, obj[k]];
});
console.log(res);
Gunakan Object.entries
untuk mendapatkan masing-masing elemen dari Objek di kunci & nilai
format, kemudian peta
melalui mereka seperti ini:
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var res = Object.entries(obj).map(([k, v]) => ([Number(k), v]));
console.log(res);
Tapi, jika anda yakin bahwa kunci akan di progresif order anda dapat menggunakan Object.values
dan Array#map
untuk melakukan sesuatu seperti ini:
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
// idx is the index, you can use any logic to increment it (starts from 0)
let result = Object.values(obj).map((e, idx) => ([++idx, e]));
console.log(result);
Dengan lodash, di samping jawaban yang diberikan di atas, anda juga dapat memiliki kunci pada keluaran array.
untuk:
const array = _.values(obj);
Jika obj adalah sebagai berikut:
{ “art”: { id: 1, title: “aaaa” }, “fiction”: { id: 22, title: “7777”} }
Kemudian array akan:
[ { id: 1, title: “aaaa” }, { id: 22, title: “7777” } ]
Jika anda menulis bukan ('genre' adalah sebuah string yang anda pilih):
const array= _.map(obj, (val, id) => {
return { ...val, genre: key };
});
Anda akan mendapatkan:
[
{ id: 1, title: “aaaa” , genre: “art”},
{ id: 22, title: “7777”, genre: “fiction” }
]
ES6 (ES2015)implementasi menggunakan Set
Anda dapat menggunakan Array.dari() atau Menyebar sintaks
Array.dari() Contoh
const names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
const uniqueNames = Array.from(new Set(names));
console.log(uniqueNames);
Menyebar sintaks Contoh
const names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
const uniqueNames = [...new Set(names)];
console.log(uniqueNames);
Menggunakan di
var obj = { "10":5, "2":7, "3":0, "4":0, "5":0, "6":0, "7":0,
"8":0, "9":0, "10":0, "11":0, "12":0 };
var objectToArray = function(obj) {
var _arr = [];
for (var key in obj) {
_arr.push([key, obj[key]]);
}
return _arr;
}
console.log(objectToArray(obj));
Kita dapat mengubah Nomor untuk tipe String untuk Kunci seperti di bawah ini:
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var result = Object.keys(obj).map(function(key) {
return [String(key), obj[key]];
});
console.log(result);
Rekursif mengkonversi objek ke array
function is_object(mixed_var) {
if (mixed_var instanceof Array) {
return false;
} else {
return (mixed_var !== null) && (typeof( mixed_var ) == 'object');
}
}
function objectToArray(obj) {
var array = [], tempObject;
for (var key in obj) {
tempObject = obj[key];
if (is_object(obj[key])) {
tempObject = objectToArray(obj[key]);
}
array[key] = tempObject;
}
return array;
}
anda dapat menggunakan _.castArray(obj).
contoh:
_.castArray({ 'a': 1 }); // => [{ 'a': 1 }]