Quelle est la meilleure façon de convertir:
['a','b','c']
à:
{
0: 'a',
1: 'b',
2: 'c'
}
javascript
arrays
node.js
object
David Hellsing
la source
la source
_.keyBy
(anciennement_.indexBy
): lodash.com/docs#keyBy_.toPlainObject
. Ex:var myObj = _.toPlainObject(myArr)
Réponses:
ECMAScript 6 présente le polyfillable facilement
Object.assign
:La propre
length
propriété du tableau n'est pas copiée car elle n'est pas énumérable.En outre, vous pouvez utiliser la syntaxe de diffusion ES6 pour obtenir le même résultat:
la source
{ ...[sortedArray]}
Avec une fonction comme celle-ci:
Votre tableau est déjà plus ou moins juste un objet, mais les tableaux ont un comportement "intéressant" et spécial en ce qui concerne les propriétés nommées entières. Ce qui précède vous donnera un objet simple.
modifier oh aussi vous voudrez peut-être tenir compte des "trous" dans le tableau:
Dans les runtimes JavaScript modernes, vous pouvez utiliser la
.reduce()
méthode:Celui-ci évite également les "trous" dans le tableau, car c'est ainsi que cela
.reduce()
fonctionne.la source
[]
) si vous n'utilisez pas les clés de propriété numériques et la propriété "length".const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Vous pouvez utiliser un accumulateur aka
reduce
.Passez un objet vide
{}
comme point de départ; puis "augmentez" cet objet progressivement. A la fin des itérations,result
sera{"0": "a", "1": "b", "2": "c"}
Si votre tableau est un ensemble d'objets de paire clé-valeur:
produira:
{a: 1, b: 2, c: 3}
Par souci d'exhaustivité,
reduceRight
vous permet d'itérer sur votre tableau dans l'ordre inverse:produira:
{c:3, b:2, a:1}
Votre accumulateur peut être de n'importe quel type à des fins spécifiques. Par exemple, afin d'échanger la clé et la valeur de votre objet dans un tableau, passez
[]
:produira:
[{1: "a"}, {2: "b"}, {3: "c"}]
Contrairement à
map
,reduce
ne peut pas être utilisé comme mappage 1-1. Vous avez un contrôle total sur les éléments que vous souhaitez inclure ou exclure.reduce
Vous permet donc de réaliser ce quifilter
fait, ce qui le rendreduce
très polyvalent:produira:
[{2: "b"}, {3: "c"}]
Attention :
reduce
etObject.key
font partie deECMA 5th edition
; vous devez fournir un polyfill pour les navigateurs qui ne les prennent pas en charge (notamment IE8).Voir une implémentation par défaut de Mozilla .
la source
Si vous utilisez jquery:
la source
{0: 'a', 1: 'b', 2: 'c'}
ce qui est un résultat attendu.Pour être complet, ECMAScript 2015 (ES6) se propage. Nécessite un transpilateur (Babel) ou un environnement exécutant au moins ES6.
la source
Je l'écrirais probablement de cette façon (car très rarement je n'aurai pas la bibliothèque underscorejs à portée de main):
la source
obj=_.extend({},a);
ferait l'affaire. De plus, si vous parcourez des tableaux, je dirais que ce_.each
serait plus approprié que_.map
. Dans l'ensemble, ce n'est pas une bonne réponse à plusieurs niveaux.Voici une méthode O (1) ES2015 juste pour être complète.
la source
length
propriété propre . (3) l'objet est toujours un tableau,Array.isArray(arr) === true
. (4) Les comportements de tableaux spéciaux ne sont pas supprimés, par exemple,arr.length = 0
supprime tous les indices. (5) Par conséquent, je pense queObject.assign
c'est beaucoup mieux .Array.isArray
revienttrue
pour l '"objet" ici même siinstanceof Array
ne le fait pas ...Surpris de ne pas voir -
la source
{ "first":"a", "second":"b","third":"c" }
avec les clés en cours de correction - je cherche un destructnous pouvons utiliser
Object.assign
etarray.reduce
fonctionner pour convertir un tableau en objet.la source
J'ai fini par utiliser l'opérateur de répartition d'objets, car il fait partie de la norme ECMAScript 2015 (ES6).
Faites le violon suivant comme exemple.
la source
Le moyen le plus simple en JavaScript moderne est d'utiliser
Object.assign()
qui ne fait que copier la clé: la valeur d'un objet à un autre. Dans notre cas,Array
fait don de propriétés à neuf{}
.la source
O.assign
mais il manquait d'explication. Désormais, la déstructuration d'un tableau en objet est un moyen ({...array}
)Pour ES2016, opérateur réparti pour les objets. Remarque: c'est après ES6 et le transpilateur devra donc être ajusté.
la source
Cinq ans plus tard, il y a un bon moyen :)
Object.assign
a été introduit dans ECMAScript 2015.la source
En utiliser
javascript#forEach
un peut le faireAvec ECMA6:
la source
FWIW, une autre approche récente consiste à utiliser le nouveau
Object.fromEntries
avecObject.entries
comme suit:... qui permet d'éviter de stocker des éléments de tableau épars sous la forme
undefined
ounull
et préserve les clés non indexées (par exemple, entier non positif / non numérique).On voudra peut-être ajouter
arr.length
, cependant, comme cela n'est pas inclus:la source
vous pouvez utiliser l'opérateur de propagation
la source
Si vous utilisez ES6, vous pouvez utiliser Object.assign et l'opérateur d'étalement
Si vous avez un tableau imbriqué comme
la source
new Map([['key1', 'value1'], ['key2', 'value2']]);
Un rapide et sale:
la source
{0:"c", 1:"b", 2:"a"}
. Vous voulez soitunshift
au lieu depop
ou (mieux) commencer pari=arr.length-1
et décrémenter à la place.l = arr.length
, et puiswhile (l && (obj[--l] = arr.pop())){}
(je me rends compte que c'est vieux, mais pourquoi ne pas le simplifier encore plus).Rapide et sale # 2:
la source
i < a.length
au lieu dea[i]
.Depuis Lodash 3.0.0, vous pouvez utiliser _.toPlainObject
la source
Voici une fonction récursive que je viens d'écrire. C'est simple et ça marche bien.
Voici un exemple ( jsFiddle ):
Résultats:
la source
['a' = '1', 'b' = '2', 'c' = '3']
et que vous voulez que{a: 1, b: 2, c: 3}
cela fonctionne parfaitement.[docs]
ou plus verbeux
ou
le plus court avec vanille JS
un exemple plus complexe
encore plus court (en utilisant
function(e) {console.log(e); return e;}
===(e)=>(console.log(e),e)
)[/ docs]
la source
[/docs]
? Il serait plus utile de rendre les extraits de code exécutables.Je le ferais simplement avec
Array.of()
. Array of a la capacité d'utiliser son contexte comme constructeur.Nous pouvons donc nous lier
Array.of()
à une fonction et générer un objet de type tableau.En utilisant
Array.of()
on peut même faire un sous-classement de tableau .la source
Si vous pouvez utiliser
Map
ouObject.assign
, c'est très simple.Créez un tableau:
Ce qui suit crée un objet avec l'index comme clés:
Répliquez la même chose que ci-dessus avec Maps
Convertit en un objet basé sur un index,
{0 : 'css'}
etc.Convertir en un objet basé sur une valeur,
{css : 'css is great'}
etc.la source
Une méthode simple et effrontée de convertir rapidement un tableau d'éléments en un objet
Puis l'utiliser comme ça ...
Production:
Vérification du type:
ET les choses ne seraient pas complètes s'il n'y avait pas de méthode prototype
Utilisation comme:
Production:
* REMARQUE: il n'y a pas de routine de nommage, donc si vous voulez avoir des noms spécifiques, vous devrez continuer à utiliser les méthodes existantes ci-dessous.
Méthode plus ancienne
Cela vous permet de générer à partir d'un tableau un objet avec des clés que vous définissez dans l'ordre que vous souhaitez.
console.log(">>> :" + result.onion);
affichera "paint", la fonction doit avoir des tableaux de longueur égale ou vous obtenez un objet vide.Voici une méthode mise à jour
la source
Ou utiliser
la source
ES5 - Solution:
En utilisant la fonction de prototype de tableau «pousser» et «appliquer», vous pouvez remplir l'objet avec les éléments du tableau.
la source
{ name: a, div :b, salary:c}
Plus de navigateur pris en charge et une manière plus flexible de faire cela en utilisant une boucle normale , quelque chose comme:
Mais la manière moderne pourrait également être d'utiliser l' opérateur de propagation , comme:
Ou attribuer un objet :
Les deux reviendront :
la source
Vous pouvez utiliser une fonction comme celle-ci:
Celui-ci devrait gérer plus efficacement les tableaux clairsemés.
la source
Voici une solution en coffeescript
la source
obj[i] = v for v,i in arr when v?