Fungsi pemetaan objek: lanjutkan fungsi Peta kepada objek
P粉060528326
P粉060528326 2023-10-08 19:58:09
0
2
851

Saya ada objek:

myObject = { 'a': 1, 'b': 2, 'c': 3 }

Saya sedang mencari kaedah asli yang serupa dengan Array.prototype.map yang 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 fungsi map untuk objek sedemikian? (Saya mahukan ini untuk Node.JS, jadi saya tidak mengambil berat tentang isu merentas penyemak imbas.)

P粉060528326
P粉060528326

membalas semua(2)
P粉138871485

Bagaimana pula dengan menulis satu ayat setiap baris menggunakan JS ES10 / ES2019?

Gunakan Object.entries( )Object.fromEntries():

let newObj = Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, v * v]));

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);

Dalam ES7/ES2016, anda tidak boleh menggunakan Objects.fromEntries,但您可以使用Object.assign dengan pengendali sebaran dan nama kunci yang dikiraSintaks:

let newObj = Object.assign({}, ...Object.entries(obj).map(([k, v]) => ({[k]: v * v})));

ES6 / ES2015 tidak dibenarkan Object.entries,但您可以使用 Object.keys ditukar 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 menggunakan reduce untuk 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 objek kelas yang ada dalam rantai prototaipnya. Dalam kes ini, Object.keys()Object.keys()Object.entries() dan Object.entry()

tidak akan berfungsi kerana fungsi ini tidak mengandungi rantai prototaip.

Jika anda perlu memetakan sifat warisan for (key in myObj) {...}, anda boleh menggunakan untuk (masukkan myObj) {...}

.

Berikut adalah contoh situasi sedemikian:

const 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 elakkan warisan. :-)🎜
P粉826429907

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 }
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan