2014-08-31 85 views
0

如果我有一個數組,選擇非連續元素的簡單方法是什麼?例如第二和第五元素:如何從Javascript數組中選擇非連續元素?

a = ["a","b","c","d","e"] 
a.select_elements([1,4]) // should be ["b","e"] 

編輯

我才意識到我可以做[1,4].map(function(i) {return a[i]})。有沒有更詳細的方式?

+0

如果你想將它們存儲到變量,那麼在即將到來的ECMAScript 6,你就可以使用解構賦值'VAR {1:X,4:Y} =一;' ,它會將'x'和'y'變量設置爲'1'和'4'成員。 – 2014-08-31 22:18:57

+1

如果你想要「內置」的東西,JavaScript允許你使用適當構造函數的'.prototype'來擴展原生數據類型,這樣你就可以編寫一個簡單的方法,例如:'a.grab(1,4)',它將返回一個與這些成員的新陣列。 – 2014-08-31 22:23:30

+1

我認爲「詳細」的方式看起來不錯。如果需要,將其隱藏在函數中(我會避免更改現有類型的原型,因爲我更喜歡獨立助手)。 – user2864740 2014-08-31 22:39:24

回答

1

您可以放心地(不會在循環顯示)函數添加到所有陣列:

Object.defineProperty(Array.prototype, 'get', { 
    __proto__: null, 
    value: function() { 
     return Array.prototype.slice.call(arguments).map(function(index){ return this[index] }.bind(this)); 
    } 
}) 

用法:

a = [1, 2, 3, 4, 5, 6]; 
a.get(1, 4); 

無變化版:

Object.defineProperty(Array.prototype, 'get', { 
    __proto__: null, 
    value: function(indices) { 
     return indices.map(function(index){ return this[index] }.bind(this)); 
    } 
}) 

用法:

a = [1, 2, 3, 4, 5, 6]; 
a.get([1, 4]); 
1

沒有什麼內置的你可以這樣做:

a.select_elements([a[1], a[4]]); 

...它構造一個新的數組,使用元素a[1]a[4],然後通過該到a.select_elements功能。

3

創建一個新的數組,手動元素:

var select_elements = [a[1], a[4]]; 

,或者創建構建從指數新陣列的功能:

function selectElementsWithIndices(sourceArray, selectIndices) 
{ 
    var result = new Array(); 

    for (var i = 0; i < selectIndices; i++) { 
     var index = selectIndices[i]; 
     result.push(sourceArray[index]); 
    } 

    return result; 
} 

var select_elements = selectElementsWithIndices(a, [1, 4]); 
4

如果你正在尋找的東西,使您的代碼看起來更短,您可以擴展Array以使用此方法:

Array.prototype.select_elements = function(indices) { 
    var elements = []; 
    for (var i=0; i != indices.length; ++i) 
     elements.push(this[indices[i]]); 
    return elements; 
} 

現在您可以調用t他的方法你想:

a.select_elements([1,4]) 

["b", "e"] 
+0

好的解決方案,但我可能會跳過數組,並通過迭代'arguments'對象使其成爲可變方法。雖然你的問題符合代碼概念。 – 2014-08-31 22:26:29

+0

你可以這樣做,但要注意如果你想選擇很多元素,可變參數方法會導致堆棧溢出。單個數組參數不會溢出堆棧。 – ldgabbay 2014-09-01 00:32:45

相關問題