![](/img/trans.png)
[英]javascript - custom object prototype method turns into index in array loop
[英]Javascript custom array prototype
我有例如這個多維數組:
MyArray[('A', 40, true), ('B', 20, false), ('C', 55, true), ('D', 17, true)]
並且我想實現一個自定義的min()和max()原型來獲得最小和最大只有'是'真的'......任何技巧? 我堅持認為,因為我在思考.map()以提取某個屬性但是如何檢查是否啟用了由於true / false屬性而提取。
確切地說,我做了:
var MyArray = [];
MyArray.push( {
name: 'A',
valueA: 40,
valueB: 36,
enabled: true
});
MyArray.push( {
name: 'B',
valueA: 20,
valueB: 18,
enabled: false
});
MyArray.push( {
name: 'C',
valueA: 55,
valueB: 75,
enabled: true
});
.
.
.
這就是為什么我要尋找狀態為真的最大和最小的原因,不包括那些假的......
我試圖實現:
Array.minElement = function(array, prop) {
return Math.min.apply(Math,
array.filter(function(arr) { return arr['enabled']; })
.map(function(arr) { return arr[prop]; })
);
}
Array.maxElement = function(array, prop) {
return Math.max.apply(Math,
array.filter(function(arr) { return arr['enabled']; })
.map(function(arr) { return arr[prop]; })
);
}
所以我應該調用像Array.minElement(MyArray,'valueA')來獲得最小值,但看起來它不起作用....它應該返回min ...
我在這里做錯了什么?......
謝謝所有Cheers Luigi
如果MyArray
看起來像:
var MyArray = [['A', 40, true], ['B', 20, false], ['C', 55, true], ['D', 17, true]]
我會使用filter
和map
的組合來獲取數組,然后應用Math
方法:
Math.max.apply(Math,
MyArray.filter(function(arr) { return arr[2]; })
.map(function(arr) { return arr[1]; })
); // => 55
最后我重新實現了minElement和maxElement,如下所示:
Array.minElement = function(array, prop) {
var lowest = Number.POSITIVE_INFINITY;
for (var i=array.length-1; i>=0; i--) {
if (parseFloat(array[i][prop]) < lowest) lowest = parseFloat(array[i][prop]);
}
return lowest;
}
Array.maxElement = function(array, prop) {
var highest = Number.NEGATIVE_INFINITY;
for (var i=array.length-1; i>=0; i--) {
if (parseFloat(array[i][prop]) > highest) highest = parseFloat(array[i][prop]);
}
return highest;
}
現在它運作良好
數組無法真正擴展,但這是一個例子。
var createSpecialArray = (function () {
function max() {
return this.reduce(function (maxVal, item) {
var val = item[1];
return item[2]?
((maxVal === null || maxVal < val)? val : maxVal) :
maxVal;
}, null);
}
return function createSpecialArray() {
var arr = Array.apply([], arguments);
arr.max = max;
return arr;
};
})();
然后你可以這樣做:
var myArray = createSpecialArray(['A', 40, true], ['B', 20, false], ['C', 55, true], ['D', 17, true]);
console.log(myArray.max()); //55
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.