Подтвердить что ты не робот

Javascript: использование кортежей в качестве словарных клавиш

У меня есть ситуация, когда я хочу создать сопоставление от кортежа к целому. В python я бы просто использовал кортеж (a,b) как ключ к словарю,

Есть ли у Javascript кортежи? Я обнаружил, что (a,b) в javascript как выражение просто возвращает b (последний элемент). По-видимому, это наследуется от C.

Итак, как обходной путь, я думал, что могу использовать массивы,

my_map[[a,b]] = c

Я попробовал его на консоли Firebug и, похоже, работал. Это хороший способ сделать это?

Другая альтернатива, о которой я думал, - создать строку из кортежей

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

Итак, возникает вопрос: есть ли какие-либо проблемы с любым из этих методов? Есть ли лучший способ?

EDIT:

Небольшое пояснение: в моем случае a, b, c - целые числа

4b9b3361

Ответ 1

EcmaScript не различает индексацию свойства по имени или [], например.

a.name

буквально эквивалентен

a["name"]

Единственное отличие состоит в том, что числа и т.д. не являются допустимым синтаксисом в именованном доступе свойств

a.1
a.true

и т.д. все недопустимый синтаксис.

Увы, причина в том, что все эти механизмы индексирования одинаковы, потому что в EcmaScript все имена свойств являются строками. например.

a[1]

эффективно интерпретируется как

a[String(1)]

Что означает в вашем примере:

my_map[[a,b]] = c

Которое становится

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

Это по сути то же, что и ваш второй пример (в зависимости от реализации он может быть быстрее).

Если вам нужны истинные ассоциативно-зависимые поисковые запросы, вам нужно будет реализовать его самостоятельно поверх языка js, и вы потеряете доступ к стилю nice []: - (

Ответ 2

Вы можете использовать мой jshashtable, а затем использовать любой объект в качестве ключа, хотя , если ваши кортежи представляют собой массивы целых чисел Я думаю, что ваш лучший выбор - тот, о котором вы упоминали: используйте метод join() Array для создания имен свойств обычного объекта. Вы можете обернуть это очень просто:

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] ) );

Ответ 3

Все ключи объектов в Javascript являются строками. Использование my_map[[a,b]] = c приведет к созданию ключа в my_map, который является результатом [a,b].toString(): a.toString() + ',' + b.toString(). Это может быть действительно желательным (и похоже на использование a + ':' + b), но вы можете столкнуться с конфликтами, если в ваших ключах содержится разделитель (либо запятая, если вы используете массив в качестве ключа, либо двоеточие, если вы пишете строка, как у вас в вашем примере).

Изменить: альтернативный подход состоял бы в том, чтобы сохранить отдельный массив для ключевых ссылок. Например:

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 */
};

Ответ 4

Самый простой и "естественный" способ добиться чего-то подобного - использование многомерных массивов, например:

var my_map = [["blah","blah","bla"],
              ["foo", "bla", 8],
              [324, 2345, 235],
              [true, false, "whatever..."]];