Saya ada objek:
myObject = { 'a': 1, 'b': 2, 'c': 3 }
Saya sedang mencari kaedah asli yang serupa denganArray.prototype.mapyang boleh digunakan seperti ini:
newObject = myObject.map(function (value, label) { return value * value; }); // newObject is now { 'a': 1, 'b': 4, 'c': 9 }
Adakah JavaScript mempunyai fungsimapuntuk objek sedemikian? (Saya mahukan ini untuk Node.JS, jadi saya tidak mengambil berat tentang isu merentas penyemak imbas.)
Bagaimana pula dengan menulis satu ayat setiap baris menggunakan JSES10 / ES2019?
Gunakan
Object.entries( )和Object.fromEntries():Tulis perkara yang sama sebagai fungsi:
function objMap(obj, func) { return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, func(v)])); } // To square each value you can call it like this: let mappedObj = objMap(obj, (x) => x * x);Fungsi ini juga menggunakan rekursi ke objek bersarang segi empat sama:
function objMap(obj, func) { return Object.fromEntries( Object.entries(obj).map(([k, v]) => [k, v === Object(v) ? objMap(v, func) : func(v)] ) ); } // To square each value you can call it like this: let mappedObj = objMap(obj, (x) => x * x);DalamES7/ES2016, anda tidak boleh menggunakan
Objects.fromEntries,但您可以使用Object.assigndenganpengendali sebarandannama kunci yang dikiraSintaks:let newObj = Object.assign({}, ...Object.entries(obj).map(([k, v]) => ({[k]: v * v})));ES6 / ES2015tidak dibenarkan
Object.entries,但您可以使用Object.keysditukar kepada:let newObj = Object.assign({}, ...Object.keys(obj).map(k => ({[k]: obj[k] * obj[k]})));ES6 juga memperkenalkan gelung
for...of, membenarkan gaya yang lebih penting:let newObj = {} for (let [k, v] of Object.entries(obj)) { newObj[k] = v * v; }array.reduce()
Anda juga boleh menggunakanreduceuntuk ini:
let newObj = Object.entries(obj).reduce((p, [k, v]) => ({ ...p, [k]: v * v }), {});Sifat warisan dan rantai prototaip:
Dalam beberapa kes yang jarang berlaku, anda mungkin perlu memetakan objekkelasyang ada dalamrantai prototaipnya. Dalam kes ini,
tidak akan berfungsi kerana fungsi ini tidak mengandungi rantai prototaip.Object.keys()Object.keys()和Object.entries()danObject.entry()Jika anda perlu memetakan sifatwarisan
untuk (masukkan myObj) {...}
. Berikut adalah contoh situasi sedemikian:for (key in myObj) {...}, anda boleh menggunakanconst obj1 = { 'a': 1, 'b': 2, 'c': 3} const obj2 = Object.create(obj1); // One of multiple ways to inherit an object in JS. // Here you see how the properties of obj1 sit on the 'prototype' of obj2 console.log(obj2) // Prints: obj2.__proto__ = { 'a': 1, 'b': 2, 'c': 3} console.log(Object.keys(obj2)); // Prints: an empty Array. console.log(Object.entries(obj2)); // Prints: an empty Array. for (let key in obj2) { console.log(key); // Prints: 'a', 'b', 'c' }Tetapi tolong bantu saya dan elakkanwarisan. :-)Tidak sampai
Object对象的本机map, tetapi bagaimana pula dengan ini:var myObject = { 'a': 1, 'b': 2, 'c': 3 }; Object.keys(myObject).forEach(function(key, index) { myObject[key] *= 2; }); console.log(myObject); // => { 'a': 2, 'b': 4, 'c': 6 }