在对象数组中查找 属性 的最小值和最大值的快速方法

Rapid way to find min and max values of a property in an array of objects

我有一个这样的对象数组:

arr = [
    {name: "Alex", value: 1}, 
    {name: "Bill", value: 2},
    {name: "Jim",  value: 3},
    {name: "Dim",  value: 5}
]

我想要快速和干净的方法来获得值的最小值和最大值 属性

min = 1,
max = 5

var min = Number.POSITIVE_INFINITY,
    max = Number.NEGATIVE_INFINITY;

arr.forEach(function(obj) {
   min = Math.min(min, obj.value);
   max = Math.max(max, obj.value);
});

您可以使用 map() 到 return 值数组,然后使用扩展语法 Math.max/min

var arr = [{name:'Alex', value:1}, {name:'Bill', value:2},{name:'Jim', value: 3},{name: 'Dim', value:5}]

var values = arr.map(e => e.value);
var min = Math.min(...values);
var max = Math.max(...values);

console.log(max)
console.log(min)

您可以 map 值并使用 Math 函数来获得最高值和最低值。

var arr = [{name:'Alex', value:1}, {name:'Bill', value:2},{name:'Jim', value: 3},{name: 'Dim', value:5}],
    hash = arr.map(v => v.value),
    min = Math.min.apply(Math, hash),
    max = Math.max.apply(Math, hash);
    
    console.log(min, max);

或者只是根据 value 属性 对对象数组进行排序,然后选择第一个和最后一个。

var arr = [{name:'Alex', value:1}, {name:'Bill', value:2},{name:'Jim', value: 3},{name: 'Dim', value:5}],
    hash = arr.sort((a,b) => a.value - b.value);
    min = hash[0].value;
    max = hash[hash.length-1].value;
    
    console.log(min, max);

最高效的可能是一个简单的循环

arr = [
    {name: "Alex", value: 1}, 
    {name: "Bill", value: 2},
    {name: "Jim",  value: 3},
    {name: "Dim",  value: 5}
]

let min,max;

for (var i=arr.length; i--;) {
  if ((!min) || arr[i].value < min) min = arr[i].value;
  if ((!max) || arr[i].value > max) max = arr[i].value;
}

console.log(min, max)

最短的写法,类似

arr = [
    {name: "Alex", value: 1}, 
    {name: "Bill", value: 2},
    {name: "Jim",  value: 3},
    {name: "Dim",  value: 5}
]

let m=Math,a=arr.map(z=>z.value);let [min,max]=[m.min(...a),m.max(...a)];

console.log(min,max)

您可以对数组使用 reduce 函数,最小值为:

arr.reduce(function(prev, curr) {
    return prev.value < curr.value ? prev : curr;
});

max 的工作方式类似

你可以创建一个函数来为你做这件事,每次你需要找到 min/max,它只需要你一行:

function findMM (arr) {
    var minV;
    var maxV;
    var firstLoop = true;
    arr.forEach(function(object){
        if (firstLoop) {
            minV = object.value;
            maxV = object.value;
            firstLoop = false;
        } else {
            if (object.value < minV){ minV = object.value }
            if (object.value > maxV){ maxV = object.value }
        }
    });
    return {min: minV, max: maxV};
}

//using the function
var results = findMM(arr);
console.log(JSON.stringify(results)); //output: {"min":1,"max":5}

您可以使用本机 Array.prototype.sort() 对数组进行排序并取第一个和最后一个值。

let data = [{
    name: 'Ales',
    value: 1
  },
  {
    name: 'Dim',
    value: 5
  },
  {
    name: 'Bill',
    value: 2
  },
  {
    name: 'Jim',
    value: 3
  }
];

data = data.sort((a, b) => a.value - b.value);

let min = data [0].value;
let max = data [data .length - 1].value;


console.log('min:',  min);
console.log('max:', max)

备注:

如果您改用:

let min = data [0];
let max = data [data .length - 1];

您可以 return 具有最小值或最大值的完整对象,这可能很方便。

使用reduce()

var arr = [{name:'Alex', value:1}, {name:'Bill', value:2},{name:'Jim', value: 3},{name: 'Dim', value:5}]

var result = arr.reduce(function(acc, val){
    return { min: Math.min(acc.min, val.value),
            max: Math.max(acc.max, val.value)}
    }, {min: arr[0].value, max: arr[0].value});

console.log(result.max);
console.log(result.min);