5 个回答
function max(arr, key = 'total') {
    if (!Array.isArray(arr) && !arr.length) {
        return -1;
    }
    let index = 0,
        max = arr[0][key];

    arr.forEach((item, i) => {
        let temp = item[key];

        if (max < temp) {
            max = temp;
            index = i;
        }
    });

    return index;
}

如果total是大于等于0的整数,可以考虑这么写,有点不正统不过。

//模拟你的数据,最大值有可能存在好几个
var a = [{t:3},{t:5},{t:4},{t:2},{t:1},{t:33},{t:33},{t:32}];
//空数组用于算结果
var b = [];
//循环a数组赋值给b
a.map((t,i) => {
    if(b[t.t]) {
        b[t.t].push(i);
    } else  {
        b[t.t] = []; 
        b[t.t].push(i)} 
    })
//获取b最后一个元素既是最大值的下标组成的数组
var maxArr = b[b.length - 1];

b数组是这样的。
clipboard.png

思路是将total作为下标强行赋值给b数组,使b改变length,并把下标赋给b相应的数组元素上,这样最大的那个就是b数组的最后一个。

不正之处请见谅并指出,谢谢。

var data = [{
    ver: '1.2.34',
    total: 2,
    uni_count: 0
}, {
    ver: '1.2.67',
    total: 11,
    uni_count: 0
}, {
    ver: '1.0.66',
    total: 9,
    uni_count: 0
}, {
    ver: '1.0.64',
    total: 11,
    uni_count: 0
}, {
    ver: '1.0.34',
    total: 1,
    uni_count: 0
}, {
    ver: '1.0.24',
    total: 11,
    uni_count: 0
}, {
    ver: '1.0.20',
    total: 11,
    uni_count: 0
}, {
    ver: '1.0.08',
    total: 1,
    uni_count: 0
}];

//先按数组中total的大小排序数组
var sortData = data.slice().sort((a,b)=>a.total < b.total);

//按照最大的total存入数组(处理并列最大的),
var maxArr = sortData.filter((item,index)=>item.total === sortData[0].total);


//返回在原数组中下标位置,**已经能够获得最大的组数项,感觉没必要知道下标了!**
var indexArr = [];  
maxArr.forEach((item,index)=>{
    data.forEach((v,i)=>{
        if(item.ver === v.ver){
            indexArr.push(i);
        }
    })
});

console.log(indexArr);
var a = [{t:2},{t:5},{t:4},{t:3}];
var max = [a[0].t,0]
for (var i = 1; i < a.length; i++) {
    if(a[i].t>max[0]){
        max[0]=a[i].t;
        max[1]=i;
    }
}
console.log(max);

好吧,原来是下标,我以为是返回最大的 obj 呢

es5的话,先 sort,然后 pop 或者 shift 出来呗
es6的话,reduce

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题