Pregunta

Tengo una situación en la que quiero crear una asignación de una tupla a un entero. En python, simplemente usaría una tupla (a, b) como la clave de un diccionario,

¿Tiene Javascript tuplas? Descubrí que (a, b) en javascript como expresión simplemente devuelve b (el último elemento). Aparentemente esto se hereda de C.

Entonces, como solución alternativa, pensé que podría usar matrices en su lugar,

my_map[[a,b]] = c

Lo probé en la consola Firebug y parecía funcionar. ¿Es esa una buena manera de hacerlo?

Otra alternativa que pensé es crear una cadena de las tuplas

my_map[""+a+":"+b] = c

Entonces la pregunta es: ¿hay algún problema con alguno de estos métodos? ¿Hay una mejor manera?

EDITAR:

Pequeña aclaración: en mi caso, a, b, c son todos enteros

¿Fue útil?

Solución

EcmaScript no distingue entre indexar una propiedad por nombre o por [] , por ejemplo.

a.name

es literalmente equivalente a

a["name"]

La única diferencia es que los números, etc. no son una sintaxis válida en un acceso de propiedad con nombre

a.1
a.true

y demás son sintaxis no válida.

Por desgracia, todos estos mecanismos de indexación son los mismos porque en EcmaScript todos los nombres de propiedad son cadenas. por ejemplo.

a[1]

se interpreta efectivamente como

a[String(1)]

Lo que significa en tu ejemplo que haces:

my_map[[a,b]] = c

Que se convierte

my_map[String([a,b])] = c

Que es esencialmente lo mismo que está haciendo su segundo ejemplo (sin embargo, dependiendo de la implementación, puede ser más rápido).

Si desea verdaderas búsquedas asociativas de valor, deberá implementarlo usted mismo en la parte superior del lenguaje js, y perderá el agradable acceso de estilo [] :-(

Otros consejos

Puede usar mi jshashtable y luego usar cualquier objeto como clave, aunque suponiendo que sus tuplas son matrices de enteros creo que su mejor opción es una que haya mencionado usted mismo: use el método join () de Array para crear nombres de propiedad de un objeto regular. Podría envolver esto de manera muy simple:

function TupleDictionary() {
 this.dict = {};
}

TupleDictionary.prototype = {
 tupleToString: function(tuple) {
  return tuple.join(",");
 },

 put: function(tuple, val) {
  this.dict[ this.tupleToString(tuple) ] = val;
 },

 get: function(tuple) {
  return this.dict[ this.tupleToString(tuple) ];
 }
};

var dict = new TupleDictionary();
dict.put( [1,2], "banana" );
alert( dict.get( [1,2] ) );

Todas las claves de objeto en Javascript son cadenas. El uso de my_map [[a, b]] = c producirá una clave en my_map que es el resultado de [a, b] .toString () : a.toString () + ',' + b.toString () . Esto puede ser realmente deseable (y es similar a su uso de a + ':' + b ), pero puede encontrar conflictos si sus claves contienen el separador (ya sea la coma si usa la matriz como la clave, o los dos puntos si escribe la cadena como lo hizo en su ejemplo).

Editar: Un enfoque alternativo sería mantener una matriz separada para referencias clave. Por ejemplo:

var keys = [
    [a,b],
    [c,d]
];
var my_map = {
    'keys[0]': /* Whatever [a,b] ought to be the key for */,
    'keys[1]': /* Whatever [c,d] ought to be the key for */
};

el más simple y natural La forma de lograr algo similar es mediante el uso de matrices multidimensionales, como esta:

var my_map = [["blah","blah","bla"],
              ["foo", "bla", 8],
              [324, 2345, 235],
              [true, false, "whatever..."]];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top