обходной путь: словарь JavaScript, который принимает объекты в качестве ключей - PullRequest
11 голосов
/ 27 июля 2010

Я прочитал несколько вопросов и ответов о реализации словаря javascript, но они не отвечают моим требованиям:

  • словарь должен иметь возможность принимать объекты в качестве ключей
  • значения должны быть доступны оператору []

. Поэтому мне пришла в голову идея перезаписать метод "valueOf" в Object.prototype следующим образом:


   Object.__id__ = 0;
   Object.prototype.valueOf = function() {
      if(!this.__id__)
         this.__id__ = ++Object.__id__;
       return "__id__" + this.__id__;
   }
   Object.prototype.toString = Object.prototype.valueOf;

   //test   
   var x = {p1: "5"};
   var y = [6];
   var z = {};
   z[x] = "7";
   z[y] = "8";
   console.log(z[x], z[y]);

Я проверил это с помощью Google-Chrome, и, кажется, он работает хорошо, но я немного скептически отношусь к тому, не вызовет ли это некоторые недостатки, поскольку его было так легко реализовать.

Учитывая, что метод valueOf не используется для других целей во всем коде, как вы думаете, есть ли недостатки?

Ответы [ 3 ]

5 голосов
/ 27 июля 2010

Это интересная идея.Я предлагаю мой jshashtable .Это соответствует вашему первому требованию, но не второму.На самом деле я не вижу преимущества в том, чтобы настаивать на использовании обозначения доступа к свойству в квадратных скобках: есть ли у вас особые требования к нему?

С помощью jshashtable вы можете предоставить функцию хеширования конструктору Hashtable.Эта функция передает объект для использования в качестве ключа и должна возвращать строку;Вы можете использовать функцию, не отличающуюся от имеющейся у вас, без необходимости касаться Object.prototype.

У вашей идеи есть некоторые недостатки:

  1. Ваш метод valueOf будетпоказывать в цикле for...in над любым собственным объектом;
  2. У вас нет способа определить, какие ключи следует считать равными, и это то, что вы, возможно, захотите сделать.Вместо этого все ключи будут считаться уникальными.
  3. Это не будет работать с объектами хоста (т.е. объектами, предоставляемыми средой, такими как элементы DOM)
2 голосов
/ 27 июля 2010

Это интересный вопрос, потому что я до сих пор предполагал, что любой объект может использоваться в качестве индекса (но никогда не пытался использовать ассоциативные массивы). Я не знаю достаточно о внутренней работе JavaScript, чтобы быть уверенным, но я бы поспорил, что valueOf используется где-то еще в JavaScript, даже если не в вашем коде. Вы можете столкнуться с, казалось бы, необъяснимыми проблемами позже. По крайней мере, я бы ограничил себя новым классом и оставил бы объект в покое;) Или вы явно вызываете свою функцию хеширования, вызывая ее myHash () или что угодно, и вызывая z [x.myHash ()], которая добавляет беспорядок, но позволяет лично мне лучше спать;) я не могу удержаться от мысли, что есть более разумное решение для этого, поэтому рассмотрим все эти уродливые обходные пути;)

0 голосов
/ 10 марта 2018

Если вы столкнулись с этим вопросом в поисках словаря JS, в котором объекты являются ключами, посмотрите Map Карта против объекта в JavaScript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...