سؤال

أريد إنشاء مجموعة النقابي:

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

وأريد أن تكون على يقين من أن أي مفتاح الوصول سيكون عدد:

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

أنا أعرف شبيبة لا يجب الكتابة, لذلك أنا لا يمكن أن تحقق تلقائيا هذا ولكن لا يمكن أن تضمن في التعليمات البرمجية الخاصة بي أنا فقط تعيين السلاسل إلى هذا aa.

الآن أنا أخذ المفاتيح من المستخدم.أريد أن عرض قيمة هذا المفتاح.ومع ذلك ، إذا كان المستخدم يعطيني شيئا مثل "toString", سيعود وظيفة لا int!هل هناك أي طريقة للتأكد من أي سلسلة يعطيني هو فقط شيء أنا تعريف ؟ هو الحل الوحيد شيئا مثل:

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

الخ...

هل كانت مفيدة؟

المحلول

سيكون هذا العمل بالنسبة لك ؟

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

تحديث:

مع مساعدة من موس عنق و 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".

نصائح أخرى

وأحد الاحتمالات سيكون لاستخدام hasOwnProperty للتأكد من أن المفتاح هو شيء قمت بإضافتها صراحة إلى مجموعة. وذلك بدلا من:

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

وكنت أقول:

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

وبدلا من ذلك، يمكنك استخدام تشير typeof للتأكد من أن كل شيء عددا قبل إعادته. ولكن أنا أحب نهج hasOwnProperty، لأنها سوف تبقي لكم من العودة أي شيء كنت لم يضع عمدا في المصفوفة.

والجواب بسيط حقا: عند إنشاء أرفقت مفتاح جديد مع بعض ثابت سلسلة الخاصة بك.

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

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

function getkey(userstring)
{
  return a[k+userstring];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top