2011-05-26 19 views
11

從我所瞭解的option中彈出的元素select HTML中的元素是一個數組。
所以基本上我想要做的是返回一個數組字符串,用逗號分隔。Javascript selecbox.options數組?

試圖做selecbox.options.join(',');,但得到了一個錯誤,它不支持;任何人有一個想法爲什麼?

+2

你想返回一個元素數組轉換爲一個字符串,用逗號分隔 - 這是沒有意義的。它基本上是'[object HTMLOptionElement],[object HTMLOptionElement]'你是說你想讓每個選項的值用逗號分隔,或者將一個類似數組的對象轉換爲一個簡單的數組? – 2011-05-26 12:15:29

回答

11

這不是一個數組。這是一個對象。它是「陣列狀」

http://api.jquery.com/jQuery.each/可以遍歷或者:

遍歷對象和數組。 長度屬性(例如函數的 自變量對象)的數組和類似數組的對象被迭代 數字索引,從0到length-1。 其他對象通過它們的 命名屬性進行迭代。

每個HTML Option element有一個值和一個文本和一些更多的屬性。

一個簡單的for循環可用於

vals = [] 
var sel = document.querySelector("select"); 
for (var i=0, n=sel.options.length;i<n;i++) { // looping over the options 
    if (sel.options[i].value) vals.push(sel.options[i].value); 
} 

通過typeracer發佈將返回HTMLOptionElements數組,它仍然需要繞在或映射得到的值和文本

這裏Array.apply是3個版本,將返回相同的。

var vals, sel = document.querySelector("select"), show=function(vals) {$("#result").append("[" + vals.join("][") + "]<hr/>");} 
 

 
// jQuery mapping jQuery objects - note the "this" and the .get() 
 
vals = $('select > option').map(function() {return this.value;}).get(); 
 
show(vals); 
 

 
// plain JS using loop over select options 
 
vals = []; 
 
for (var i = 0, n = sel.options.length; i < n; i++) { // looping over the options 
 
    if (sel.options[i].value) vals.push(sel.options[i].value); // a bit of testing never hurts 
 
} 
 
show(vals); 
 

 

 
// Plain JS using map of HTMLOptionElements - note the el 
 
vals = Array.apply(null, sel.options).map(function(el) { return el.value; }); 
 
show(vals);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
 
<select> 
 
<option value="Please select">Text 0</option> 
 
<option value="one">Text 1</option> 
 
<option value="two">Text 2</option> 
 
<option value="three">Text 3</option> 
 
</select> The above select has the following option values:<br/> 
 
<span id="result"></span>

+0

據我所知它是一個選項數組(否則我們如何可以通過索引訪問項目?像selectbox.options [1]?) 我需要它採取所有值(不只是選定的值), 連接它們用逗號和返回結果。 – Dementic 2011-05-26 12:00:03

+0

「options屬性是特定Select對象中所有選項的數組,每個

+0

好吧,所以從你的編輯我瞭解selecbox.options實際上是一個對象數組,而不是一個普通的數組。是對的嗎 ? – Dementic 2011-05-26 12:07:50

1

你可以加入字符串數組,而是一個選項不是一個字符串,它與各種樣值和文本屬性的對象。它應該用來加入?

你只需編寫一個循環來追加你想要的所有值。

或者使用庫並使用一些each()函數來遍歷選項。

+0

使用庫嗎?爲這個功能?爲我的項目添加65k的一件簡單的事情? 這是一個不好的建議。 – Dementic 2011-05-26 12:03:49

+0

我的意思只是當你已經在使用一個庫。我只是想讓選項清楚。 – edwin 2011-05-26 12:34:20

6

爲了讓所有的值到一個數組:

var options = document.getElementById('selectId').options; 
var values = []; 
var i = 0, len = options.length; 

while (i < len) 
{ 
    values.push(options[i++].value); 
} 
alert(values.join(', ')); 

小提琴:http://jsfiddle.net/garreh/64pyb/1/


哇很長的路要走做一些短

那麼你可以使用for循環,而不是更短但更難看;

for (var options = document.getElementById('selectId').options, 
      values, i = 0, len = options.length; i < len;i++) 
    values.push(options[i].value); 

alert(values.join(', ')); 

然後再次,這是一個遺憾,你不使用類似jQuery的庫。你可以這樣做:

$('select > option').map(function() { return this.value; }).get(); 
+0

哇,做一些簡短的事情很長的路:)但thx! – Dementic 2011-05-26 12:06:17

+0

select>沒有s的選項,非常好的http://jsfiddle.net/mplungjan/jwrML/ – mplungjan 2011-05-26 13:24:46

3

selecbox.options是一個(nodeList)集合。您可以像對數組一樣遍歷它的元素,並將集合的成員推送到真實數組。

對於記錄:在所有的瀏覽器,但IE 9 <可以使用[].slice.call(selecbox.options);到集合快速轉換到一個數組。

因此,一個跨瀏覽器的方式,以一個節點列表集合轉換成數組是:

function coll2array(coll){ 
    var ret = []; 
    try { 
     ret = [].slice.call(coll) 
    } 
    catch(e) { 
     for (var i =0;i<coll.length;i++){ 
      ret.push(coll[i]); 
     } 
    } 
    return ret; 
} 

[編輯]如今(ES2015及以上),我們可以使用Array.from([arraylike object])

Array.prototype.slice.call([some collection])

+0

thx的信息,但作爲最佳實踐,我更喜歡CrossBrowser解決方案。 – Dementic 2011-05-26 12:06:45

+0

此外,您仍然需要處理這個HTMLOptionElement對象的新數組。 – mplungjan 2011-05-26 12:20:41

2

select.options不是數組,它是一個NodeList,其全體的陣列的特徵,因此可以被描述爲陣列狀。一個NodeList沒有Array所具有的方法,但您可以使用callapply這些方法。 你的情況,你可以調用join方法是這樣的:

var opts = yourSelect.options; 
var str = Array.prototype.join.call(opts, ','); 

另外,您可以在節點列表轉換成一個真正的磁盤陣列和類似的技術

// slice returns a new array, which is what we want 
var optsArray = Array.prototype.slice.call(opts); 
+1

但是,返回'[object HTMLOptionElement],[object HTMLOptionElement],[object HTMLOptionElement],[object HTMLOptionElement]' – mplungjan 2011-05-26 12:17:21

+1

@mplungjan - true,[object HTMLOptionElement] is the調用Option.toString()的結果。所以使用這個答案作爲解決方案是非常沒用的。我的答案確實解釋了爲什麼?部分OP的問題目前 – meouw 2011-05-26 12:21:16

11

最簡潔的解決方案是這樣的:

Array.apply(null, selectbox.options) 

Array.apply使用第一個參數作爲上下文調用Array構造函數(即this )和第二個參數是任何類似數組的對象(MDN reference)。

我們通過null作爲第一個參數,因爲我們沒有試圖調用特定對象上的方法,而是調用全局構造函數。

所以一般來說,

Array.apply(null, A) 

將創建一個包含任何「陣列狀」對象A的元素的合適的陣列。

+0

MDN目前[對瀏覽器兼容性的幫助不大](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply#Browser_compatibility) ,但在Chrome,FF和IE上進行了一些快速測試,看起來像是Modern Browser Friendly(c)2016。非常好的答案。 – ruffin 2016-04-23 15:29:00

+3

並僅獲取這些選項的文本:Array.apply(null,selextbox.options).map(function(el){return el.text;}); – webdevinci 2016-06-07 17:40:56

+0

注意:'Array.apply(null,document.querySelector(「select」)。options)'仍然會產生'[object HTMLOptionElement],[object HTMLOptionElement],[object HTMLOptionElement],[object HTMLOptionElement]' - 或者需要循環才能獲取值和文本 – mplungjan 2017-04-06 07:46:55