如果我有一個數組,選擇非連續元素的簡單方法是什麼?例如第二和第五元素:如何從Javascript數組中選擇非連續元素?
a = ["a","b","c","d","e"]
a.select_elements([1,4]) // should be ["b","e"]
編輯
我才意識到我可以做[1,4].map(function(i) {return a[i]})
。有沒有更詳細的方式?
如果我有一個數組,選擇非連續元素的簡單方法是什麼?例如第二和第五元素:如何從Javascript數組中選擇非連續元素?
a = ["a","b","c","d","e"]
a.select_elements([1,4]) // should be ["b","e"]
編輯
我才意識到我可以做[1,4].map(function(i) {return a[i]})
。有沒有更詳細的方式?
您可以放心地(不會在循環顯示)函數添加到所有陣列:
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]);
沒有什麼內置的你可以這樣做:
a.select_elements([a[1], a[4]]);
...它構造一個新的數組,使用元素a[1]
和a[4]
,然後通過該到a.select_elements
功能。
創建一個新的數組,手動元素:
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]);
如果你正在尋找的東西,使您的代碼看起來更短,您可以擴展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"]
好的解決方案,但我可能會跳過數組,並通過迭代'arguments'對象使其成爲可變方法。雖然你的問題符合代碼概念。 – 2014-08-31 22:26:29
你可以這樣做,但要注意如果你想選擇很多元素,可變參數方法會導致堆棧溢出。單個數組參數不會溢出堆棧。 – ldgabbay 2014-09-01 00:32:45
如果你想將它們存儲到變量,那麼在即將到來的ECMAScript 6,你就可以使用解構賦值'VAR {1:X,4:Y} =一;' ,它會將'x'和'y'變量設置爲'1'和'4'成員。 – 2014-08-31 22:18:57
如果你想要「內置」的東西,JavaScript允許你使用適當構造函數的'.prototype'來擴展原生數據類型,這樣你就可以編寫一個簡單的方法,例如:'a.grab(1,4)',它將返回一個與這些成員的新陣列。 – 2014-08-31 22:23:30
我認爲「詳細」的方式看起來不錯。如果需要,將其隱藏在函數中(我會避免更改現有類型的原型,因爲我更喜歡獨立助手)。 – user2864740 2014-08-31 22:39:24