2010-03-09 38 views
17

Tôi đã tạo bản đồ google theo hướng dữ liệu với các biểu tượng khác nhau được chỉ định cho bản đồ tùy thuộc vào loại mục nằm. Vì vậy, nếu tôi có 5 loại mốc, và mỗi được một biểu tượng khác nhau (cửa hàng, thư viện, bệnh viện, vv) - những gì tôi muốn làm là tạo ra các đối tượng biểu tượng google động. Tôi đã nghĩ như sau:Có cách nào dễ dàng để tạo các biến động với Javascript?

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++; 
    } 

tuy nhiên, như bạn có thể đoán, điều này không hiệu quả. Tôi cũng đã thử sử dụng eval, như thế này:

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

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

nhưng nó không hoạt động - tôi đánh giá cao mọi con trỏ về việc tạo biến javascript động. Nó phải là js tinh khiết, tôi có thể làm điều đó trong PHP nhưng đó không phải là một lựa chọn ở đây.

Cảm ơn!

+1

+1 - Chào mừng bạn đến với StackOverflow :-) –

+1

JavaScript thực sự là ngôn ngữ động. Bạn hiếm khi cần sử dụng câu lệnh eval cho những thứ như thế này, bởi vì bạn chủ yếu có thể viết bất cứ điều gì bạn muốn miễn là cú pháp là chính xác và nếu những gì bạn viết không tồn tại, bạn sẽ gặp lỗi thời gian chạy. Một điều tốt đẹp về javascript là khả năng window.close giống như cửa sổ viết ["close"]. Vì vậy, bạn thậm chí có thể viết cửa sổ ["close"](); hoặc var c = "close"; cửa sổ [c](); – Alxandr

Trả lời

33

Nó thực sự dễ dàng để làm: object["variablename"] = whatever;

Vì vậy, ví dụ bạn có thể có một đối tượng: var Landmarks = {} và bạn có thể thêm vào nó như vậy: Landmarks["landmark" + i] = new google.maps.Icon(); và vượt qua nó như vậy.

Nếu bạn cần các biến này là toàn cầu (tại sao bạn?), Bạn có thể truy cập đối tượng toàn cầu trực tiếp bằng cách sử dụng window.

+0

Cảm ơn Plynx! Điều này đã kết thúc làm việc tốt cho tôi. Tôi đánh giá cao sự giúp đỡ. – julio

+2

@julio, Plynx: Không chắc chắn làm thế nào để nói điều này mà không có vẻ cay đắng, nhưng điều này sẽ là khủng khiếp javascript. Giống như tôi đã nói trong câu trả lời của tôi, điều này rất là những gì mảng javascript được cho. Nếu bạn đang hạnh phúc để viết javascript của bạn như thế này thì đủ công bằng nhưng tôi nghĩ rằng nó sẽ làm cho bạn một coder tốt hơn nếu bạn đã học để làm điều đó một cách chính xác :-) –

+1

+1 Brilliant Code ..! Nó đã cứu tôi ..! Cảm ơn bạn.! – writeToBhuwan

3

Bạn muốn được tốt hơn việc tạo ra một đối tượng javascript mà bạn có thể sử dụng một số giống như một mảng kết hợp được sử dụng trong 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" 
5

Nếu bạn đang đi để làm điều đó bằng cách sử dụng đối tượng tuyên bố như Landmark["landmark" + i] , bạn thực sự cũng có thể sử dụng một mảng chỉ mục chứ không phải là một kết hợp, nó dễ dàng hơn nhiều cho việc lặp lại. Đối tượng không thực sự sử dụng với bất động sản được lập chỉ mục bởi vì Mảng làm một công việc tốt hơn nhiều của nó:

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

Nhiều hơn nữa hợp lý để sử dụng các mảng:

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++; 
} 

Nó làm cho ý nghĩa hơn để làm điều đó theo cách đó và for...in vòng trên các đối tượng có thể nhận được một chút lộn xộn với những đặc tính prototyped là đếm được, vv

Nếu bạn đang cố gắng để tạo ra một biến toàn cầu, thêm nó vào đối tượng cửa sổ:

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

alert(landmark0); 

Nhưng điều này sẽ gây ô nhiễm không gian tên chung với nhiều biến không cần thiết. Vì vậy, bạn vẫn muốn được tốt hơn với một mảng:..

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

cảm ơn Andy - Tôi đã thử giải pháp của bạn và có vẻ như bạn không thể đẩy đối tượng này lên một mảng. Tôi đã gặp lỗi cú pháp mỗi lần tôi thử. Tuy nhiên, khi tôi làm như sau: var icon = new google.maps.Icon(); landmark.png (biểu tượng); nó hoạt động tốt. vấn đề sau đó đã trở thành rằng tôi muốn có được một "mốc [i] không xác định" nếu tôi đã cố gắng thiết lập các thuộc tính khác bằng cách sử dụng các địa chỉ [i] .image = etc. Bất kỳ suy nghĩ nào? – julio

+0

@julio: hãy xem tài liệu phương pháp đẩy trên MSDN - http://msdn.microsoft.com/en-us/library/6d0cbb1w(VS.85).aspx. Đảm bảo rằng 'mốc = []' của bạn nằm ngoài vòng lặp, nếu không bạn sẽ liên tục ghi đè nó. Hãy tin tôi, những gì bạn đang cố gắng đạt được là lý do mảng tồn tại. –

+0

ps - phương thức đẩy rất hữu ích trả về độ dài mới của mảng, vì vậy bạn có thể kiểm tra giá trị trả về để xem liệu những gì bạn đang đẩy là làm cho nó vào mảng. –

4

Chỉ cần trả lời câu hỏi của bạn trực tiếp (mặc dù xin lưu ý rằng đây không phải là giải pháp bạn muốn Kiểm tra các câu trả lời khác Đây chỉ là tài liệu hướng dẫn cho!), đây là bản sao chép từ bảng điều khiển JavaScript:

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

Bạn có thực sự cần những biến đó không?bạn không thể làm với điều này:

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

Modifications thực hiện dựa trên nhận xét:

tên biểu tượng mô hình thay đổi từ biểu tượng dấu + Chỉ số + .png để biểu tượng + loại + .png và lưu kết quả của vòng lặp.

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

kết quả là: { bệnh viện: biểu tượng, thờ: biểu tượng, ... }

nơi biểu tượng là một biểu tượng bản đồ google có một thuộc tính hình ảnh đó là một chuỗi các biểu mẫu "icon {type} .png", ví dụ: iconhostpital.png, iconchurch.png.

Để sử dụng các biểu tượng viết landmarks.type trong đó loại là một trong các tên trong mảng các loại, ví dụ: landmarks.hospital.

nếu tên hình ảnh có biểu tượng biểu mẫu + số + .png và số cho mỗi loại tương đương với chỉ mục trong mảng thay thế lệnh createIcon (loại [i]) cho createIcon (i).

+0

Sau khi tôi biết nhưng để làm rõ mã này sẽ không hoạt động vì nó đứng và tại sao bất kỳ ai lấy nó để sao chép. Bạn chưa đóng gói mã "cho" {}, do đó bạn sẽ kết thúc với kết quả cuối cùng, ngẫu nhiên sẽ là icon3.png bởi vì bạn thực sự muốn thêm các loại [i] không phải i là số đếm trong vòng lặp for . –

+0

trong biểu tượng câu hỏi có dạng "biểu tượng" + i + ".png "=" icon1.png ", bạn nói biểu mẫu mong muốn là" biểu tượng "+ các loại [i] +" pgn "=" iconhostpital.png ". Về việc không lưu biểu tượng bạn thích. – Alfgaar

+0

Tôi chưa trình bày Tôi nghĩ là, xây dựng tên hình ảnh từ nhiều loại, tạo biểu tượng google, đặt tên hình ảnh thành thuộc tính hình ảnh biểu tượng google và sử dụng nó. Không cần biến số nhận dạng được xác định động. – Alfgaar

Các vấn đề liên quan