Quelle est la meilleure façon de convertir :
['a','b','c']
à :
{
0: 'a',
1: 'b',
2: 'c'
}
Quelle est la meilleure façon de convertir :
['a','b','c']
à :
{
0: 'a',
1: 'b',
2: 'c'
}
Avec une fonction comme celle-ci :
function toObject(arr) {
var rv = {};
for (var i = 0; i < arr.length; ++i)
rv[i] = arr[i];
return rv;
}
Votre tableau est déjà plus ou moins un objet, mais les tableaux ont un comportement "intéressant" et spécial en ce qui concerne les propriétés nommées par des entiers. L'exemple ci-dessus vous donnera un objet ordinaire.
modifier oh, il faut aussi tenir compte des "trous" dans le réseau :
function toObject(arr) {
var rv = {};
for (var i = 0; i < arr.length; ++i)
if (arr[i] !== undefined) rv[i] = arr[i];
return rv;
}
Dans les moteurs d'exécution JavaScript modernes, vous pouvez utiliser la fonction .reduce()
méthode :
var obj = arr.reduce(function(acc, cur, i) {
acc[i] = cur;
return acc;
}, {});
Cette méthode permet également d'éviter les "trous" dans le tableau, car c'est ainsi que .reduce()
travaux.
Je pense que c'est génial, j'ai juste ajouté quelques trucs pour mon plaisir retourne un objet qu'on ne peut pas référencer en dehors de la fonction donc j'ai juste montré un exemple de ça et ajouté quelque chose aux noms des propriétés de l'objet x = ['a','b','c'] var b = {} function toObject(arr) { var rv = {}; for (var i = 0; i < arr.length; ++i) if (arr[i] !== undefined) { rv['key_' + i] = arr[i]; } b = rv return b; } toObject(x) b.key_0
@m93a c'est déjà un objet. En JavaScript, il est vraiment inutile de créer une instance de Array ( []
) si vous n'avez pas l'intention d'utiliser des clés de propriété numériques et la propriété "longueur".
Vous pourriez utiliser un accumulateur alias reduce
.
['a','b','c'].reduce(function(result, item, index, array) {
result[index] = item; //a, b, c
return result;
}, {}) //watch out the empty {}, which is passed as "result"
Passer un objet vide {}
comme point de départ ; puis "augmenter" cet objet de manière incrémentielle. A la fin des itérations, result
sera {"0": "a", "1": "b", "2": "c"}
Si votre tableau est un ensemble d'objets de type paire clé-valeur :
[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item) {
var key = Object.keys(item)[0]; //first property: a, b, c
result[key] = item[key];
return result;
}, {});
produira : {a: 1, b: 2, c: 3}
Dans un souci d'exhaustivité, reduceRight
vous permet d'itérer sur votre tableau dans l'ordre inverse :
[{ a: 1},{ b: 2},{ c: 3}].reduceRight(/* same implementation as above */)
produira : {c:3, b:2, a:1}
Votre accumulateur peut être de n'importe quel type pour votre usage spécifique. Par exemple, pour échanger la clé et la valeur de votre objet dans un tableau, passez la commande []
:
[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
var key = Object.keys(item)[0]; //first property: a, b, c
var value = item[key];
var obj = {};
obj[value] = key;
result.push(obj);
return result;
}, []); //an empty array
produira : [{1: "a"}, {2: "b"}, {3: "c"}]
Contrairement à map
, reduce
ne peut pas être utilisé comme un mapping 1-1. Vous avez un contrôle total sur les éléments que vous souhaitez inclure ou exclure. Par conséquent, reduce
vous permet de réaliser ce que filter
fait, ce qui rend reduce
très polyvalent :
[{ a: 1},{ b: 2},{ c: 3}].reduce(function(result, item, index) {
if(index !== 0) { //skip the first item
result.push(item);
}
return result;
}, []); //an empty array
produira : [{2: "b"}, {3: "c"}]
Attention : reduce
et Object.key
font partie de ECMA 5th edition
; vous devriez fournir un polyfill pour les navigateurs qui ne les prennent pas en charge (notamment IE8).
Voir une implémentation par défaut par Mozilla .
Bizarre, si je donne une variable Array, elle met chaque caractère dans un objet séparé : 0 : "a", 1 : ",", 2 : "b"... Donc elle ignore les guillemets, mais inclut les virgules...
@Max Je pense qu'il n'y a pas un tel comportement. L'objet retourné est {0: 'a', 1: 'b', 2: 'c'}
ce qui est un résultat attendu.
Existe-t-il un moyen d'utiliser $.extend tout en informant les clés d'une manière non numérique, c'est-à-dire en effectuant des calculs sur les éléments du tableau ?
Vous downvotez ma réponse, mais pas de commentaire ? Ma réponse est correcte et testée. Quelle est l'objection ?
Cette question n'a pas de balise underscore, et vous supposez également node.js ou une bibliothèque require.
L'underscore est assez courant sur le client et le serveur. Elle est supposée pour Backbone.js et est probablement LA bibliothèque utilitaire la plus commune. Ceci étant dit, j'ai inclus la ligne require pour qu'il soit clair que j'utilise une bibliothèque. Il n'y a pas de ligne unique pour décrire "ajouter underscore.js à votre page", donc une traduction est nécessaire pour un environnement de navigateur.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
3 votes
Peut-être que ce dont il a besoin, c'est d'un code pour taper les canards. pas de penser qu'il s'agit d'une instance de Array
7 votes
Il faut savoir que les tableaux Javascript sont objets.
0 votes
Si quelqu'un d'autre est à la recherche d'une solution Lodash, pensez à
_.keyBy
(anciennement_.indexBy
) : lodash.com/docs#keyBy0 votes
C'est un peu confus parce que les tableaux sont déjà des objets, mais je suppose que le but de la question est de convertir l'option tableau objet exotique à un objet ordinaire .
1 votes
Une façon simple de procéder avec Lodash est la suivante
_.toPlainObject
. Ex :var myObj = _.toPlainObject(myArr)
0 votes
@Spudley si oui, pourquoi alors map ne fonctionne que pour les tableaux.. ?
0 votes
@holms - parce que
.map
est une méthode deArray
.0 votes
Cela pourrait être nécessaire s'il voulait des caractéristiques de performance différentes lorsqu'il cherche à savoir si une valeur existe dans le tableau. Par exemple, map[key] est probablement OlogN(quelque chose) mais hypothétiquement array.contains(key) est N puisque ses clés sont des nombres 1..N et que chaque valeur doit être vérifiée.