432 votes

Convertir un objet JS en un tableau à l'aide de jQuery

Mon application crée un objet JavaScript, comme le suivant :

myObj= {1:[Array-Data], 2:[Array-Data]}

Mais j'ai besoin de cet objet sous forme de tableau.

array[1]:[Array-Data]
array[2]:[Array-Data]

J'ai donc essayé de convertir cet objet en un tableau en itérant avec $.each à travers l'objet et en ajoutant l'élément à un tableau :

x=[]
$.each(myObj, function(i,n) {
    x.push(n);});

Existe-t-il un meilleur moyen de convertir un objet en tableau ou peut-être une fonction ?

1 votes

Les indices du tableau doivent-ils être les mêmes que les clés de l'objet original ? Le premier indice d'un tableau est toujours 0, mais votre propre code et la plupart des réponses (y compris celle qui a été acceptée) semblent l'ignorer ; néanmoins, vous avez inversé ma modification pour obtenir le résultat souhaité dans l'exemple.

1 votes

Oui, vous avez raison : le premier élément du tableau commence par 0. Mais j'ai annulé votre modification, parce qu'il n'était pas cohérent à mes yeux de garder cet exemple aussi simple que possible, car en changeant myObj= {1:[Array-Data] a myObj= {0:[Array-Data] ne faisait pas partie de votre montage (si je me souviens bien)

3 votes

Utilisez l'outil jQuery $.makeArray(obj) pour cela api.jquery.com/jQuery.makeArray

750voto

Joel Points 1087

Si vous recherchez une approche fonctionnelle :

var obj = {1: 11, 2: 22};
var arr = Object.keys(obj).map(function (key) { return obj[key]; });

Résultats dans :

[11, 22]

De même avec une fonction flèche ES6 :

Object.keys(obj).map(key => obj[key])

Avec ES7, vous pourrez utiliser Object.values à la place ( plus d'informations ) :

var arr = Object.values(obj);

Ou si vous utilisez déjà Underscore/Lo-Dash :

var arr = _.values(obj)

10 votes

3 votes

Insatisfait de la réponse du haut, je viens d'écrire cette fonction presque exacte, je suis revenu pour la poster comme réponse, j'ai fait défiler vers le bas, j'ai vu 170. J'ai réalisé que si je n'avais pas abandonné, je n'aurais pas eu à réfléchir :) Cela devrait être en haut de la page. OP s'il vous plaît sélectionnez comme réponse.

1 votes

Pour ceux pour qui ce n'est pas évident, les clés ne doivent pas nécessairement être séquentielles (dans cet exemple, il s'agit de 1 et 2), mais il pourrait tout aussi bien s'agir d'une clé de type chaîne ou d'un nombre non séquentiel.

443voto

Dogbert Points 44003
var myObj = {
    1: [1, 2, 3],
    2: [4, 5, 6]
};

var array = $.map(myObj, function(value, index) {
    return [value];
});

console.log(array);

Sortie :

[[1, 2, 3], [4, 5, 6]]

0 votes

Non, le tableau est aplati, comme Marko l'a commenté dans mon message.

0 votes

Désolé, je n'avais pas remarqué les crochets !

0 votes

Hé - ça marche bien :-) Pensez-vous que c'est une "meilleure" façon de convertir les objets en tableaux comme ma solution ? Parce que j'essaie de garder ce code aussi simple et transparent que possible. -Facile à comprendre pour les autres.

30voto

Nicola Peluchetti Points 38948

Je pense que vous pouvez utiliser for in mais en vérifiant si la propriété n'est pas inertie

myObj= {1:[Array-Data], 2:[Array-Data]}
var arr =[];
for( var i in myObj ) {
    if (myObj.hasOwnProperty(i)){
       arr.push(myObj[i]);
    }
}

EDIT - si vous voulez vous pouvez aussi garder les index de votre objet, mais vous devez vérifier s'ils sont numériques (et vous obtenez des valeurs indéfinies pour les index manquants :

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

myObj= {1:[1,2], 2:[3,4]}
var arr =[];
for( var i in myObj ) {
    if (myObj.hasOwnProperty(i)){
        if (isNumber(i)){
            arr[i] = myObj[i];
        }else{
          arr.push(myObj[i]);
        }
    }
}

1 votes

Vous auriez dû tester le code. $.map s'aplatira Array-Data .

1 votes

Vous avez raison, je ne l'ai pas testé avec un tableau et map l'aplatit ! j'ai modifié la réponse

0 votes

@Nicola Peluchetti $.makeArray() sonne bien, mais n'est pas ce que je recherchais, car il met simplement l'objet dans un élément de tableau : [{1:[Array-Data], 2:[Array-Data]}] Et $.map() n'a pas non plus l'air de réussir. Il semble que toutes les données des sous-réseaux soient fusionnées en un seul tableau. array.length devrait retourner 2 (parce que 2 éléments existent), mais il retourne 67 qui est le nombre de tous les éléments dans tous les ["Array-Data"].

25voto

bjornd Points 11457

Si vous connaissez l'indice maximal de votre objet, vous pouvez procéder comme suit :

var myObj = {
    1: ['c', 'd'],
    2: ['a', 'b']
  },
  myArr;

myObj.length = 3; //max index + 1
myArr = Array.prototype.slice.apply(myObj);
console.log(myArr); //[undefined, ['c', 'd'], ['a', 'b']]

1 votes

Il serait bien mieux que le code qui génère l'objet définisse également la longueur ou même qu'il en fasse un tableau dès le départ. Je ne pense pas que l'un ou l'autre soit possible, donc cette réponse ne m'est d'aucune utilité.

0 votes

myObj.length = Object.keys(myObj).length

13voto

Sankalp Singha Points 1154

Et si jQuery.makeArray(obj)

C'est comme ça que je l'ai fait dans mon application.

2 votes

Vous obtenez [Objet] dans l'exemple ci-dessus.

1 votes

Il suffisait d'ajouter l'indice [0] et vous m'avez sauvé la vie :)

Prograide.com

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.

Powered by:

X