هل هناك طريقة سهلة لإنشاء متغيرات ديناميكية مع جافا سكريبت؟

StackOverflow https://stackoverflow.com/questions/2413414

  •  18-09-2019
  •  | 
  •  

سؤال

لقد قمت ببناء خريطة جوجل مدفوعة بالبيانات بأيقونات مختلفة يتم تعيينها إلى الخريطة اعتمادا على نوع العنصر الموجود. لذلك إذا كان لدي 5 أنواع من المعالم، فحصل كل أيقونة مختلفة (المتجر والمكتبة والمستشفى وما إلى ذلك) - ما أرغب في القيام به هو إنشاء كائنات أيقونة Google بشكل حيوي. كنت أفكر شيئا مثل هذا:

types = array('hospital','church','library','store',etc);
var i=0;
while (i<=types.length) {

    var landmark + i = new google.maps.Icon();
    landmark.image = "icon" + i + ".png";
    i++;
    } 

ومع ذلك، كما قد خمنت، هذا لا يعمل. لقد حاولت أيضا استخدام Eval، مثل هذا:

while (i<=types.length) {
        doIcon(i);
        i++;
    }   

    function doIcon(i){ 
        eval("var landmark" + i + " = new.google.maps.Icon();");
        return eval("landmark" + i);
    }

لكنها لم تنجح إما - كنت أقدر أي مؤشرات على توليد متغيرات جافا سكريبت بشكل حيوي. يجب أن تكون js النقي، يمكنني القيام بذلك في PHP ولكن هذا ليس خيارا هنا.

شكرا!

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

المحلول

من السهل حقا القيام به: object["variablename"] = whatever;

لذلك على سبيل المثال، يمكن أن يكون لديك كائن: var Landmarks = {} ويمكنك إضافةها مثل ذلك: Landmarks["landmark" + i] = new google.maps.Icon(); ونقله بهذه الطريقة.

إذا كنت بحاجة إلى هذه المتغيرات لتكون عالمي (لماذا أنت؟) يمكنك الوصول إلى الكائن العمومي مباشرة باستخدام window.

نصائح أخرى

إذا كنت ستفعل ذلك باستخدام كائن معلن مثل Landmark["landmark" + i], ، قد تستخدم حقا صفيف فهرس جيدا بدلا من التعاون، فمن الأسهل بكثير التكرار. الكائنات لا تستخدم حقا مع الخصائص المفهرسة لأن الصفائف تقوم بعمل أفضل بكثير منه:

var myObj =           // object version
{
   "item0": "blah",
   "item1": "blah"
   // etc
}
var myArr =           // array version
[
   "blah",
   "blah"
   // etc
]

أكثر عقلانية لاستخدام الصفيف:

landmarks = []; // new array
types = array('hospital','church','library','store',etc);  
var i=0;  
while (i<=types.length) {  
    landmarks.push(new google.maps.Icon());
    landmarks[i].image = "icon" + i + ".png";
    i++;  
}

من المنطقي أن تفعل ذلك بهذه الطريقة و for...in يمكن الحصول على حلقات على الكائنات فوضوي بعض الشيء مع العوائد النموذجية ذات العددية، إلخ.

إذا كنت تحاول إنشاء عالم عالمي متغير، فأضفه إلى كائن النافذة:

var myCustomVar = "landmark" + i;
window[myCustomVar] = new google.maps.Icon();

alert(landmark0);

ولكن هذا سيكون ملوثا مساحة الاسم العالمية مع العديد من المتغيرات غير الضرورية. لذلك ستظل أفضل مع صفيف:

window.landmarks = [];
landmarks.push(new google.maps.Icon());
// etc...

فقط للإجابة على سؤالك مباشرة (رغم أن يرجى ملاحظة ذلك هذا ليس الحل الذي تريده. تحقق من الإجابات الأخرى. هذا هو فقط للوثائق!)، إليك نسخ معجون من وحدة التحكم JavaScript:

> window["myNamedVar"] = "Hello, World!";
> console.log(myNamedVar);
  "Hello, World!"

ستكون أفضل حالا لإنشاء كائن JavaScript الذي يمكنك استخدامه إلى حد ما، ويستخدم صفيفا مشتركا في PHP:

var types = ['hospital','church','library','store'];
var landmarks= {};
for (var i in types) {
    landmarks[types[i]]= new google.maps.Icon();
    landmarks[types[i]].image = "icon" + i + ".png";
} 
alert(landmarks['hospital'].image);  // displays "icon0.png"

هل تحتاج حقا تلك المتغيرات؟ لا يمكنك أن تفعل مع هذا:

var types = ['hospital','church','library','store'];    
for(var i =0; i < types.length; i += 1) (new google.maps.Icon()).image = "icon" + i + ".png";

التعديلات التي تقوم على أساس التعليق:

تم تغيير نمط اسم ICON من Icon + Index + .png إلى أيقونة + اكتب + .png وحفظ نتائج الحلقة.

types = ['hospital','church','library','store'];
var landmarks = {};


// images names are of the form icon + type + .png
function createIcon(type) 
{ 
    var icon = new google.maps.Icon();
    icon.image = "icon" + type + ".png";
    return icon;
}

// mapping of landamarks by type and icon
for (var i = 0, len = types.length; i < len; i++)
{
    landmarks[types[i]] = createIcon(types[i]);
}

النتيجة هي: {المستشفى: أيقونة، الكنيسة: أيقونة، ...}

حيث الأيقونة هي أيقونة خريطة Google التي تحتوي على سمة صورة هي سلسلة من النموذج "icon {type} .png"، على سبيل المثال، iconhostpital.png، iconchurch.png.

لاستخدام الرموز الكتابة landmarks.type حيث النوع هو أحد الأسماء في صفيف الأنواع، على سبيل المثال landmarks.hospital.

إذا كانت أسماء الصور هي أيقونة النموذج + رقم + .png، وكان الرقم لكل نوع يعادل فهرسه في الصفيف استبدال مكالمة CreateIcon (اكتب [i]) لإنشاء CreateIcon (i).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top