0

例如,我有这个多维数组:

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

我想实现一个自定义的 min() 和 max() 原型来获得 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') 一样调用以获得最小值,但看起来它不起作用....它应该返回最小值...

我在这里做错了什么?...

非常感谢 干杯路易吉

4

3 回答 3

1

如果MyArray看起来像:

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
于 2013-11-04T16:40:48.723 回答
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;
}

现在它运作良好

于 2014-02-14T09:19:47.573 回答
0

数组不能真正扩展,但这里有一个例子。

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
于 2013-11-04T17:11:36.490 回答