Fonction de mappage d'objets : étendre la fonction Map aux objets
P粉060528326
P粉060528326 2023-10-08 19:58:09
0
2
874

J'ai un objet :

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

Je recherche une méthode native similaire à Array.prototype.map qui peut être utilisée comme ceci :

newObject = myObject.map(function (value, label) {
    return value * value;
});

// newObject is now { 'a': 1, 'b': 4, 'c': 9 }

JavaScript a-t-il une fonction map pour un tel objet ? (Je veux cela pour Node.JS, donc je ne me soucie pas des problèmes entre navigateurs.)

P粉060528326
P粉060528326

répondre à tous(2)
P粉138871485

Que diriez-vous d'écrire une phrase par ligne en utilisant JS ES10 / ES2019 ?

Utilisez Object.entries( )Object.fromEntries() :

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

Écrivez la même chose en fonction :

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

Cette fonction utilise également la récursivité pour mettre au carré les objets imbriqués :

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

Dans ES7/ES2016, vous ne pouvez pas utiliser Objects.fromEntries,但您可以使用Object.assign avec les opérateurs de propagation et les noms de clés calculésSyntaxe :

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

ES6 / ES2015 non autorisé Object.entries,但您可以使用 Object.keys modifié par :

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

ES6 introduit également des boucles for...of, permettant un style plus impératif :

let newObj = {}

for (let [k, v] of Object.entries(obj)) {
  newObj[k] = v * v;
}


array.reduce()

Vous pouvez également utiliser reduce pour cela :

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


Propriétés héritées et chaîne de prototypes :

Dans certains cas rares, vous devrez peut-être mapper un objet class qui se trouve dans sa chaîne de prototypes. Dans ce cas, Object.keys()Object.keys()Object.entries() et Object.entries()

ne fonctionneront pas car ces fonctions ne contiennent pas de chaîne de prototypes.

Si vous avez besoin de mapper des propriétés héritées for (key in myObj) {...}, vous pouvez utiliser for (clé dans myObj) {...}

.

Voici des exemples de telles situations :

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'
}
Mais s'il vous plaît, rendez-moi service et évitez l'héritage. :-)🎜
P粉826429907

Je ne suis pas arrivé Object 对象的本机 map, mais que diriez-vous de ceci :

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 }
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal