Maison > Questions et réponses > le corps du texte
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粉1388714852023-10-09 15:14:40
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; }
Vous pouvez également utiliser reduce pour cela :
let newObj = Object.entries(obj).reduce((p, [k, v]) => ({ ...p, [k]: v * v }), {});
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()
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粉8264299072023-10-09 10:42:04
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 }