Affectation d’index et de valeurs à un tableau multidimensionnel dans jQuery

Je veux append des index spécifiques (numériques) à un tableau multidimensionnel dans jQuery, puis assigner des valeurs à ces index. Chaque index sera lui-même un tableau et les index de ces sous-tableaux seront également affectés dynamicment.

$(document).ready(function(){ $('#Show').click(function(){ var AllItem = new Array(); $("select[name^='Item']").each(function(dropdownumber, selected) { var name = $(this).attr('name'); var toRemove = 'Item['; var name1 = name.replace(toRemove,''); var CategoryCode = name1.replace(']',''); alert('item category code = ' + CategoryCode); if (!AllItem[CategoryCode]){ //here I want that index 9 is set as an array, but it adds 9 elements , //I need that only one index is added ie 9 and its value is array AllItem[CategoryCode] = []; alert('added='+CategoryCode); } //length comes out to be 10 //but it should be 1 as I have added only one index ie 9 & its an array alert('length='+AllItem.length); //after this I need to assign values at 9th index of the array like // AllItem[9][0] = 2; //the value of the first index of 9th index is 2 // AllItem[9][1] = 5; // AllItem[9][2] = 6; // AllItem[9][3] = 9; 

METTRE À JOUR :

 //for adding values at indexes of AllItem : AllItem[9][1] = 5; $(this).find(':selected').each(function(selectedoptionnumber, selected) { var SelectedVal = $(selected).val(); if (SelectedVal > 0) { AllItem[CategoryCode][dropdownumber] = SelectedVal; alert(' Code = ' + AllItem[CategoryCode][dropdownumber]); } }); 
-Select- 1 2 3 4

je veux ici que l’index 9 soit défini comme un tableau, mais il ajoute 9 éléments,

J’ai besoin que seulement un index est ajouté à savoir 9 et sa valeur est un tableau

En fait, il n’ajoute pas neuf éléments, mais un seul. Ce seul élément est à l’indice 8 (vraisemblablement, pas 9 – rappelez-vous que les index commencent à 0 ); les indices 0-7 n’ont aucune valeur . Cela est dû au fait que les tableaux standard JavaScript sont insortingnsèquement peu nombreux (et ne sont pas vraiment du tout ). Plus à ce sujet ci-dessous.

la longueur sort pour être 10

mais il devrait être 1 comme j’ai ajouté un seul index à savoir 9 & son un tableau

La propriété length n’est pas définie comme un nombre du nombre d’entrées dans le tableau. Il est défini comme étant (au moins) supérieur à l’index de tableau le plus élevé. Comme les tableaux peuvent avoir des entrées manquantes, la length peut être supérieure (mais pas inférieure) au nombre d’entrées du tableau.

Maintenant, si vous n’avez pas besoin de la maturité de l’object tableau, vous pouvez simplement utiliser un object simple. La seule différence est qu’il ne possède pas de propriété length et ne comporte pas les différentes fonctions spécifiques à un tableau ( forEach , etc.). Pour ce faire, il suffit de changer votre

 var AllItem = new Array(); 

ligne à

 var AllItem = {}; 

Vous pouvez utiliser la notation [] avec des objects ainsi que des tableaux (car les tableaux ne sont que des objects, la notation [] est un object , pas un tableau ), de sorte que votre autre code ne change pas.

Mais encore une fois, la seule différence est la propriété length et les diverses fonctions du tableau.


En savoir plus sur l’ajout d’une entrée à l’index 8 ne crée pas d’entrées entre 0 et 7:

Quand tu fais ça:

 var a = []; a[8] = "value"; 

Tout ce qui se passe est que l’entrée 8 est définie sur la valeur et a.length sur 9 . Rien d’ autre n’est ajouté au tableau.

 console.log(0 in a); // false console.log(1 in a); // false ... console.log(7 in a); // false console.log(8 in a); // true! 

Les gens ont parfois du mal à comprendre cela, mais la clef à cela est dans l’article lié ci-dessus: Les tableaux ne sont pas vraiment des tableaux, ils sont juste des objects avec un peu de magie. Les tableaux “index” ne sont que Les noms de propriétés et les “entrées” de tableau ne sont que des propriétés. Donc, a[8] = "value" crée une propriété appelée “8” sur a object. Il ne crée aucune autre propriété.

Lorsque vous lisez la valeur d’une propriété qui n’existe pas (sur l’object ou son prototype), vous récupérez la valeur undefined , mais cela ne signifie pas que la propriété existe, c’est simplement la façon dont JavaScript est défini pour gérer cette situation. (lire une propriété qui n’existe pas).

L’opérateur in (utilisé ci-dessus) et la fonction hasOwnProperty vous permettent de vérifier si une propriété existe ( in regardant l’object et son (ses) prototype (s), hasOwnProperty ne regarde que l’object).


Concernant la question ci-dessous concernant votre code mis à jour, cette ligne peut poser un problème ou non, en fonction de l’autre code que vous possédez:

 AllItem[CategoryCode][dropdownumber] = SelectedVal; 

C’est bien si vous avez déjà placé un object ou un tableau dans AllItem[CategoryCode] . Si vous ne l’avez pas fait, cela provoquera une erreur.

Si vous savez que vous avez fait cela, alors la ligne va bien.

Si vous savez que vous ne l’avez pas fait, alors:

 AllItem[CategoryCode] = []; AllItem[CategoryCode][dropdownumber] = SelectedVal; 

Si vous pouvez ou non avoir fait cela, alors:

 if (!AllItem[CategoryCode]) { AllItem[CategoryCode] = []; } AllItem[CategoryCode][dropdownumber] = SelectedVal; 

(Ou parfois vous verrez ceci:

 (AllItem[CategoryCode] = AllItem[CategoryCode] || [])[dropdownumber] = SelectedVal; 

mais il n’ya généralement pas besoin de ce genre de chose, qui est difficile à lire et à déboguer.)