javascript - 在多维数组中获取具有最大值的行

时间:2014-02-25 12:20:15

标签: javascript

我有一个类似

的数组
var arr = [ [1, 4, 5],
            [2, 6, 7],
            [3, 3, 9]]

我想获得第2列中具有最大值的行,因此在此示例中第2行。如何在javascript中执行此操作?

编辑:我可以使用for循环迭代所有行并使用temp max变量来跟踪最大值。但我希望有一种更有效的方式。

由于

8 个答案:

答案 0 :(得分:3)

好吧,迭代并保留一个临时的max变量可能是最有效的方法,但是如果你想要一种看起来更令人愉悦的方法,你可以尝试类似的东西:

var col2 = arr.map(function (elem) {
    return elem[1]; //to get all the column 2 values
});

var index = col2.indexOf(Math.max.apply(this, col2));

编辑:如果要使用最后找到的元素的索引,请使用

col2.lastIndexOf(Math.max.apply(this, col2));

答案 1 :(得分:1)

没有什么可以更好的普通循环版本,但你可以像这样使用Array.prototype.reduce

var arr = [ [1, 4, 5], [2, 6, 7], [3, 3, 9]], col = 1;

var best = arr.reduce(function(tillNow, current) {
    if (tillNow.best < current[col]) {
        tillNow.best = current[col];
        tillNow.row  = current;
    }
    return tillNow;
}, {best:0, row:[]});

console.log(best.row);    # [ 2, 6, 7 ]
console.log(best);        # { best: 6, row: [ 2, 6, 7 ] }

Reduce函数接受until now值作为第一个参数,当前元素作为第二个参数。

对于第一个元素,参数将是这样的

tillNow : {best:0, row:[]} : current: [1, 4, 5]

我们将current的缩进列与tillNow.best进行比较。如果当前值大于tillNow,则最佳元素和当前行将在tillNow中设置,并且将返回该行并将反馈到reduce&# 39;下一次迭代为tillNow。因此,在我们的例子中,在第二次迭代中,值会像这样改变

tillNow : {best:4, row: [1, 4, 5]} : current: [2, 6, 7]

在第三次迭代中,

tillNow : {best:6, row: [2, 6, 7]} : current: [3, 3, 9]

最后结果将是

{ best: 6, row: [ 2, 6, 7 ] }

答案 2 :(得分:1)

此示例在每行上返回运行map,并返回一个数组,其中包含指定列中每行的编号。然后它返回该数组中最高数字的索引

function findRowForMaxInCol(arr, col) {
  var column = arr.map(function(el) { return el[col]; });
  var highest = Math.max.apply(null, column);
  return column.indexOf(highest);
}

console.log(findRowForMaxInCol(arr, 1)); // 1

Fiddle

答案 3 :(得分:1)

以下代码会为您提供最高的数字:

var array = [[1, 4, 5],
            [2, 6, 7],
            [3, 3, 9]];
var bigNum = 0;
for(var i=0;i<array.length; i++){
    var largest = Math.max.apply(Math, array[i]);
    if(largest > bigNum) {
         bigNum = largest;   
    }
}
console.log(bigNum);

答案 4 :(得分:1)

这个怎么样

var arr = [[1, 4, 5], [2, 6, 7], [3, 3, 9]],
    t;

$.each(arr, function(k, v){
    t = !t ? v[1] : (v[1] > t ? v[1] : t);
});

console.log(t);

答案 5 :(得分:1)

请试一试。

var col2 = [];
var max = 0;

$.each(arr, function(i, val){
    col2.push(val[1]);
})

max = Math.max.apply( Math, col2 );

答案 6 :(得分:0)

只需迭代数组并检查第二个元素是否最大。变量large将包含行i和最大值e

var arr = [ [1, 4, 5],
        [2, 6, 7],
        [3, 3, 9]],
    large = {i:0, e: 0};  // i: row, e: largest elem
arr.map(function (a, idx) {
    if (a[1] > large.e) { 
        large.e = a[1];
        large.i = idx;
    }
});
console.log(large);  // {i: 1, e: 6}. row: 1 and element 6.

答案 7 :(得分:0)

概括问题:在数组中找到具有最大'f(x)'的元素:

var findMax = function(array, f){
    var element = null;
    var max = -Infinity;
    for (var i=0; i!=array.length; ++i){
        var value = f(array[i]);
        if (value > max){
            element=array[i];
            max=value;
        }
    };
    return element;
};

将一般算法应用于rows,其函数返回行的第二个元素:

var secondElement= function(row){ return row[1]; };

var max = findMax(rows, secondElement);

JSFiddle