在具有某些属性的最大值的数组中返回对象的效率不高的方法?

时间:2014-01-08 17:26:43

标签: javascript

我觉得这是重复的和/或效率低下的:

self.get_max_dist = function(array) {

    var arr = array.map(function(value) {
        return value.distance;
    });

    var max = Math.max.apply(null, arr);

    return array.filter(function(el) {
        return el.distance === max;
    });

};

如何消除感觉?

示例数组:

[
    {
        distance: 256.62,
        maxspeed: 340.65,
        pid: "675",
        prestrafe: 275.626
    },

    ...

]

1 个答案:

答案 0 :(得分:2)

执行效率可能来自于通过数组而不是代码中的三遍。这是一个通过的解决方案:

self.get_max_dist = function(array) {
    var output = [], max = 0, item;
    for (var i = 0; i < array.length; i++) {
        item = array[i];
        if (item.distance > max) {
            // new max value so initialize
            // output starting with this item
            output = [item];
            max = item.distance;
        } else if (item.distance === max) {
            // found another item with our max value
            // so add it to the current output
            output.push(item);
        }
    }
    return output;
}

为了简化编码,这假设距离不是负的。如果你不想要这个假设,可以添加几行代码来处理它。


如果您只想获得一个最大距离项目,那么您可以更简单一点:

self.get_max_dist = function(array) {
    var max, item;
    for (var i = 0; i < array.length; i++) {
        item = array[i];
        if (!max || (item.distance > max.distance)) {
            max = item;
        }
    }
    return max;
}

或者,如果您喜欢迭代器,最后一个可以是:

self.get_max_dist = function(array) {
    var max;
    array.foreach(function(item) {
        if (!max || (item.distance > max.distance)) {
            max = item;
        }
    });
    return max;
}