2013-11-04 55 views
0

我有這個例子多維數組:的Javascript自定義數組原型

MyArray[('A', 40, true), ('B', 20, false), ('C', 55, true), ('D', 17, true)] 

,我想實現一個自定義分鐘()和max()的原型來獲得最大和最小的僅是放入系統「真'......任何詭計?我被困在它,因爲我正在考慮.map()來提取某個屬性,但如何檢查是否啓用提取真/假屬性。


準確地說,我所做的:

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')調用來獲取minimu米,但看起來它不工作....它應該返回分鐘...

我做錯了什麼嗎?......

感謝所有 乾杯 路易吉

+2

展我們試過的東西 – Jose

+0

你可能是指[['A',40,true],['B',20,false] ...'。在目前的形式中,它是由四個布爾值組成的陣列。 – georg

+0

你能告訴我們你試過的東西和你的預期產量嗎? – Andy

回答

1

最後我重新實現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; 
} 

,現在它工作得很好

1

如果樣子:

var MyArray = [['A', 40, true], ['B', 20, false], ['C', 55, true], ['D', 17, true]] 

我會做的filtermap的組合來獲取數組,然後應用Math方法:

Math.max.apply(Math, 
    MyArray.filter(function(arr) { return arr[2]; }) 
      .map(function(arr) { return arr[1]; }) 
); // => 55 
0

Arrays cannot really be extended但是這裏是一個例子。

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