web-dev-qa-db-fra.com

Javascript: utiliser un entier comme clé dans un tableau associatif?

Lorsque je crée un nouveau tableau javascript et que j'utilise un entier comme clé, chaque élément de ce tableau, jusqu'au nombre entier, est créé comme étant non défini. par exemple:

var test = new Array();
test[2300] = 'Some string';
console.log(test);

affichera 2298 indéfinis et un "Une chaîne".

Comment dois-je obtenir que javascript utilise 2300 en tant que chaîne au lieu d'un entier, ou comment dois-je l'empêcher d'instancier 2299 indices vides?

88
user243540

Utilisez un objet, comme disent les gens. Cependant, notez que vous pouvez pas avoir des clés entières. JavaScript va convertir l'entier en chaîne. Les sorties suivantes 20, non indéfinies:

var test = {}
test[2300] = 20;
console.log(test["2300"]);
121
Claudiu

Vous pouvez simplement utiliser un objet:

var test = {}
test[2300] = 'Some string';
33
Annie

Comme les gens disent que javascript convertira une chaîne de nombre en entier, il est donc impossible de l'utiliser directement sur un tableau associatif, mais les objets fonctionneront pour vous de la même manière, à mon avis.

Vous pouvez créer votre objet:

var object = {};

et ajouter les valeurs en tant que tableau fonctionne:

object[1] = value;
object[2] = value;

cela vous donnera:

{
  '1':value,
  '2':value
}

Après cela, vous pouvez y accéder comme un tableau dans d'autres langues en obtenant la clé:

for(key in object)
{
   value = object[key] ;
}

J'espère que c'est utile! J'ai testé et fonctionne.

21
Jesuslg123

Si le cas d'utilisation stocke des données dans une collection, alors ES6 fournit le type Map.

C'est seulement plus lourd à initialiser.

Voici un exemple:

const map = new Map();
map.set(1, "One");
map.set(2, "Two");
map.set(3, "Three");

console.log("=== With Map ===");

for (const [key, value] of map) {
    console.log(`${key}: ${value} (${typeof(key)})`);
}

console.log("=== With Object ===");

const fakeMap = {
    1: "One",
    2: "Two",
    3: "Three"
};

for (const key in fakeMap) {
    console.log(`${key}: ${fakeMap[key]} (${typeof(key)})`);
}

Résultat:

=== With Map ===
1: One (number)
2: Two (number)
3: Three (number)
=== With Object ===
1: One (string)
2: Two (string)
3: Three (string)
11
Pragmateek

Compilation d'autres réponses:

Objet

var test = {};

Lorsque vous utilisez un nombre comme clé d'une nouvelle propriété, le nombre se transforme en chaîne:

test[2300] = 'Some string';
console.log(test['2300']);
// Output: 'Some string'

Lorsque vous accédez à la valeur de la propriété en utilisant le même numéro, le numéro est à nouveau transformé en chaîne:

console.log(test[2300]);
// Output: 'Some string'

Lorsque vous récupérez les clés de l'objet, elles ne seront pas reconverties en chiffres:

for (var key in test) {
    console.log(typeof key);
}
// Output: 'string'

Carte

ES6 permet l'utilisation de l'objet Map ( documentation , ne comparaison avec Object ). Si votre code doit être interprété localement ou tableau de compatibilité ES6 vous semble suffisamment vert, utilisez une mappe:

var test = new Map();
test.set(2300, 'Some string');
console.log(test.get(2300));
// Output: 'Some string'

Aucune conversion de type n'est effectuée, pour le meilleur et pour le pire:

console.log(test.get('2300'));
// Output: undefined
test.set('2300', 'Very different string');
console.log(test.get(2300));
// Output: 'Some string'
7
wordbug

Essayez d’utiliser un objet, pas un tableau:

var test = new Object(); test[2300] = 'Some string';
3
Jeff Hammerbacher

Obtenez la valeur d'une propriété de tableau associatif lorsque le nom de la propriété est un entier:

Commençant par un tableau associatif où les noms de propriété sont des entiers:

var categories = [
    {"1":"Category 1"},
    {"2":"Category 2"},
    {"3":"Category 3"},
    {"4":"Category 4"}
];

Poussez les éléments dans le tableau:

categories.Push({"2300": "Category 2300"});
categories.Push({"2301": "Category 2301"});

Boucle à travers tableau et faire quelque chose avec la valeur de la propriété.

for (var i = 0; i < categories.length; i++) {
    for (var categoryid in categories[i]) {
        var category = categories[i][categoryid];
        // log progress to the console
        console.log(categoryid + " : " + category);
        //  ... do something
    }
}

La sortie de la console devrait ressembler à ceci:

1 : Category 1
2 : Category 2
3 : Category 3
4 : Category 4
2300 : Category 2300
2301 : Category 2301

Comme vous pouvez le constater, vous pouvez contourner la limitation de tableau associatif et attribuer un nom de propriété à un entier.

Remarque: le tableau associatif dans mon exemple est le json que vous auriez si vous sérialisé un objet Dictionary <string, string> [].

2
Jason Williams

Utilisez un objet au lieu d'un tableau. Les tableaux en JavaScript ne sont pas des tableaux associatifs. Ce sont des objets avec magie associés à toutes les propriétés dont les noms ressemblent à des entiers. Cette magie n'est pas ce que vous voulez si vous ne les utilisez pas comme une structure traditionnelle semblable à un tableau.

var test = {};
test[2300] = 'some string';
console.log(test);
2
bdukes

Parfois, j'utilise un préfixe pour mes clés. Par exemple:

var pre = 'foo',
       key = pre + 1234
       obj = {};

obj[ key ] = val;

Maintenant, vous n’avez aucun problème à y accéder.

1
pictus

Utilisez un objet - avec un entier comme clé - plutôt qu'un tableau.

0
Upperstage