J'utilise une API qui renvoie des propriétés à valeur unique sous forme de tableaux. Je voudrais l'avoir pour que s'il n'y a qu'une valeur dans le tableau, la valeur devrait être une chaîne plutôt qu'un tableau de chaînes.
J'ai créé l'extrait ci-dessous, mais je reçois "la taille maximale de la pile d'appels dépassée". Je suis évidemment dans une boucle, mais je ne sais pas trop comment m'en sortir. Des suggestions sur la façon de mapper l'objet de manière récursive et d'accomplir mon exemple ci-dessous?
const original = { a: ['foo'], b: ['bar'], c:{ d:['baz'], e:['buzz'], f:{ g:['zip'], h:['zap'] } } }; exampleResult = { a:"foo", b:"bar", c:{ d:"baz", e:"buzz", f:{ g:"zip", h:"zap" } } } function transformer(item){ return _.transform(original, (r, v, k) => { if(typeof v ==="object"){ transformer(v[0]) } if(Array.isArray(v)){ r[k] = v[0]; } }); } let result = transformer(original) console.log(result);
3 Réponses :
const original = { a: ['foo'], b: ['bar'], c:{ d:['baz'], e:['buzz'], f:{ g:['zip'], h:['zap'] } } }; function transform(o) { const transformed = {}; for (const [key, value] of Object.entries(o)) { transformed[key] = Array.isArray(value) ? value[0] : transform(value); } return transformed; } console.log(transform(original));
function transform(item) { for (var key in item) { if (typeof item[key] === 'object') { if (Array.isArray(item[key])) { item[key] = item[key][0]; } else { transform(item[key]); } } } return item; } let result = transform(JSON.parse(JSON.stringify(original))); console.log(result);
L'erreur est causée en transférant toujours original
vers le _.transform ()
ici:
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
Chaque boucle de la récursivité revient à l'objet d'origine et recommence. Pour corriger le mot de passe item
:
const transformer = item => _.transform(item, (r, v, k) => { // extract 1st item in case if an array with a single item const val = _.isArray(v) && v.length === 1 ? v[0] : v; // check if the handle value is an object and transform accordingly r[k] = _.isObject(val) ? transformer(val) : val; }); const original = { a: ['foo'], b: ['bar'], c: { d: ['baz'], e: ['buzz', 'nick', 'nack'], f: { g: ['zip'], h: ['zap'] } } }; const result = transformer(original); console.log(result);
Vous devez également corriger votre logique. Les tableaux sont également des objets, vous devez donc d'abord vérifier les tableaux. Si la valeur actuelle est un tableau et que sa longueur est de 1, attribuez val
le 1er élément. Sinon, utilisez la valeur entière.
Maintenant, vérifiez si val
est un objet, et si c'est le cas, appliquez transformer
.
return _.transform(item, (r, v, k)
return _.transform(original, (r, v, k)