2008-12-15 6 views
3

Я хочу создать ассоциативный массив:Ассоциативный массив без ToString и т.д.

var aa = {} //equivalent to Object(), new Object(), etc... 

, и я хочу быть уверенным, что любая клавиша I доступа будет номер:

aa['hey'] = 4.3; 
aa['btar'] = 43.1; 

I знаю, что JS не печатает, поэтому я не могу автоматически проверять это, но я могу обеспечить в своем собственном коде, что я только назначаю строки этому аа.

Теперь я беру ключи от пользователя. Я хочу показать значение для этого ключа. Однако, если пользователь дает мне что-то вроде «toString», он вернет функцию, а не int! Есть ли способ убедиться, что любая строка, которую он мне дает, - это только то, что я определяю? Это единственное решение, что-то вроде:

delete aa['toString']; 
delete aa['hasOwnProperty']; 

и т.д ...

ответ

3

Будет ли это работать на вас?

function getValue(id){ 
    return (!isNaN(aa[id])) ? aa[id] : undefined; 
} 

Update:

С помощью Мосс Collum и pottedmeat Я рекомендую этот общее решение:

function getValue(hash,key) { 
    return Object.prototype.hasOwnProperty.call(hash,key) ? hash[key] : undefined; 
} 

Update2: Если бы забыла». вызов". (Спасибо pottedmeat за указание, что выход)

Update3: (О клавишах)

Обратите внимание на следующее: Ключ будет внутренне быть преобразован в строку, поскольку ключ на самом деле имя атрибута.

var test = { 
    2:"Defined as numeric", 
    "2":"Defined as string" 
} 

alert(test[2]); //Alerts "Defined as string" 

Если пытаться использовать объект:

var test={}, test2={}; 
test[test2]="message"; //Using an object as a key. 

alert(test[test2]); //Alerts "message". Looks like it works... 

alert(test[ test2.toString() ]); 
//If it really was an object this would not have worked, 
// but it also alerts "message". 

Теперь, когда вы знаете, что это всегда строка, позволяет использовать его:

var test={}; 

var test2={ 
    toString:function(){return "some_unique_value";} 
    //Note that the attribute name (toString) don't need quotes. 
} 

test[test2]="message"; 
alert(test[ "some_unique_value"]); //Alerts "message". 
4

Одним из возможных вариантов было бы использовать hasOwnProperty, чтобы проверить, что ключ что-то явно добавляется в массив. Таким образом, вместо:

function findNumber(userEnteredKey) { 
    return aa[userEnteredKey]; 
} 

вы бы сказали:

function findNumber(userEnteredKey) { 
    if (Object.prototype.hasOwnProperty.call(aa,userEnteredKey)) 
     return aa[userEnteredKey]; 
} 

В качестве альтернативы, вы можете использовать TypeOf, чтобы проверить, что все это номер перед его возвращением. Но мне нравится подход hasOwnProperty, потому что он заставит вас возвращать все, что вы не намеренно помещали в массив.

+0

Проблема в том, что он не сработает, если пользователь ввел ключ «hasOwnProperty». – some 2008-12-15 04:15:02

+0

Вы должны использовать `Object.prototype.hasOwnProperty.call (aa, userEnteredKey)` – pottedmeat 2008-12-15 04:17:25

2

Действительно простой ответ: когда вы создаете новый ключ добавляет его с некоторой строковой константой.

var a = {}; 
var k = 'MYAPP.COLLECTIONFOO.KEY.'; 

function setkey(userstring) 
{ 
    a[k+userstring] = 42; 
} 

function getkey(userstring) 
{ 
    return a[k+userstring]; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^