2016-06-28 86 views
-1

爲了這個問題,這是我遇到的問題的簡化版本。如何根據選擇值將變量傳遞給函數?

如果我在我的HTML一個<select>

<select> 
    <option value="1">1</option> 
    <option value="2">2</option> 
    <option value="3">3</option> 
    <option value="4">4</option> 
    <option value="5">5</option> 
    <option value="6">6</option> 
</select> 

然後我的JS:

var a,b = 12; 
var c1,d1,e1, 
    c2,d2,e2, 
    c3,d3,e3, 
    c4,d4,e4, 
    c5,d5,e5, 
    c6,d6,e6 = // Assigned individually from loop. NOT actual code. 


function myFunction(a,b,c,d,e){ 
    // do something with a,b,c,d,e 
} 

$('select').on('change', function() { 
    var id = $(this).val(); 
    c = c+id; 
    d = d+id; 
    e = e+id; 
    myFunction(a, b, c, d, e); 
} 

在上面的代碼,如果我選擇選項3,我想通過函數變量C3 ,d3,e3。

如何將id從'3'分配給傳遞的變量?這段代碼的選擇部分有什麼問題?

請幫忙。謝謝。


問題#2:@大衛的回答

繼如果我建立在你建議的方式對象的數組。

destinations = [ 
    {id:'123', title:'London', lat:'1.52121' , lng:'-1.3423423', content:'a string'}, 
    {id:'456', title:'Paris',  lat:'1.52121' , lng:'-1.3423423', content:'a string'}, 
    {id:'634', title:'Amsterdam', lat:'1.52121' , lng:'-1.3423423', content:'a string'} 
] 

如果我想要再通過遍歷數組和谷歌地圖標記與每個對象創建變量,我怎麼

$.each(destinations, function(i, ob) { 
    $.each(ob, function (key, value) { 
    var marker[ob.id] = new google.maps.Marker({ 
     draggable: false, 
     map: map, 
     icon: dotMarker, 
     position: {lat: ob.lat, lng: ob.lng} 
    }); 
}); 
+0

首先,我會用數組或對象來保存所有的值,並非所有的單個變量 – DelightedD0D

+3

一個更合理的數據結構,好像是叫在這裏。 'c','d'和'e'好像是它們形成一個對象,並且你需要這些對象的數組。然後你只需要該數組中的第三個元素。 – David

+1

像這樣的東西可能是去https://jsfiddle.net/otmegmnu/ –

回答

3

考慮一個更合理的數據結構,而不是所有的個體變量。啓動與對象:

{ 
    c: '', 
    d: '', 
    e: '' 
} 

畢竟,如果cde應當以某種方式來解釋一起,代表東西是連接,那麼這聽起來像你想描述一個對象。

這時正好有一個對象的數組:

var myObjects = [ 
    { c: '', d: '', e: '' }, 
    { c: '', d: '', e: '' }, 
    { c: '', d: '', e: '' }, 
    // etc. 
] 

這更符合您的評論暗示什麼:

//從環路動態分配

然後值您的選項值將包含的僅僅是您要查找的元素的索引

<select> 
    <option value="0">1</option> 
    <option value="1">2</option> 
    <option value="2">3</option> 
    <option value="3">4</option> 
    <option value="4">5</option> 
    <option value="5">6</option> 
</select> 

,你可以得到基於該指數的元素:

var id = $(this).val(); 
var myObject = myObjects[id]; 
myFunction(a, b, myObject.c, myObject.d, myObject.e); 

可能更可以做在這裏改善的事情,但本例的人爲性質使得它在語義含糊。這裏的要點是把邏輯放入你正在使用的結構中,而不是用複雜的邏輯來解釋缺少結構。

「智能數據結構和啞代碼的工作方式比其他方式要好得多。」
- 埃裏克雷蒙,「大教堂和市集」

+0

謝謝。我明白你的意思。更好。 :D –

+0

Hi @David和其他人, 如果您不介意,還有其他問題: –

+0

我已經添加了第二個問題,涉及您的答案。如果你有時間,請看看。請參閱主要問題主體中的問題#2更新。非常感謝。 –

0

有許多改進你的代碼,但如果你想使用目前的結構,那麼你可以做這樣的事情。

var a,b = 12; //note: all variables are defined in global (window) scope 
var c1,d1,e1, 
    c2,d2,e2, 
    c3,d3,e3, 
    c4,d4,e4, 
    c5,d5,e5, 
    c6,d6,e6 = // Assigned individually from loop. NOT actual code. 

$('select').on('change', function() { 
    var id = $(this).val(); //let it be 3 
    var c = window['c' + id]; //c3 
    var d = window['d' + id]; //d3 
    var e = window['e' + id]; //e3 
    myFunction(a, b, c, d, e); 
}