如何从数组中获得具有最大属性的对象

How to get object with largest property from array?

本文关键字:属性 对象 数组      更新时间:2023-09-26

我有一个对象数组,每个对象包含其他'子对象'。我需要返回具有最大'quality'属性的子对象。

下面的代码注销所有子对象。我怎么能只退质量最好的那件呢?

var maxQuality = function(Arr) {
    Arr.forEach(function(obj, index) {
      Math.max.apply(Math, obj.products.map(function(subObj) {
        console.log(subObj);
      }))
    });
  },
  store = [
    {
      products: [
        {
          quality: 1,
          info: 'info 1'
        },
        {
          quality: 2,
          info: 'info 2'
        },
        {
          quality: 3,
          info: 'info 3'
        }
      ]
    }
  ],
  maxQualityProduct = maxQuality(store);

您可以使用数组

上的reduce()方法来做到这一点

var products = [
  {
    quality: 1,
    info: 'info 1'
  },
  {
    quality: 2,
    info: 'info 2'
  },
  {
    quality: 3,
    info: 'info 3'
  }
];
var highest = products.reduce(function(prev, current) {
  return prev.quality > current.quality ? prev : current
}, {});
console.log(highest);

注意,reduce接受两个参数—一个是回调,第二个是您开始的初始项,称为seed。在这种情况下,由于我们只检查一个平值,因此空对象的种子将正常工作,因为当从它获取属性quality时,它将返回undefined,并且这将小于任何其他产品。但是,对于更复杂的结构或比较,可能需要从数组中给出一个实际的项作为种子。

虽然其他.reduce答案可能会给你你需要的,如果存储数组包含多个对象-不确定这是否是你想要/需要的-你可以使用这个:

var maxQuality = function(storeArray) {
    function highestQuality(prev, curr) {
        return prev.quality > curr.quality ? prev : curr
    }
    return storeArray.map(function(obj) {
      return obj.products.reduce(highestQuality)
    }).reduce(highestQuality);
}

我想这归结为一个简单的Array.prototype.sort的事情:

products.sort(( a, b ) => b.quality - a.quality )[ 0 ];

您可以使用以下代码片段:

var maxQuality = function(Arr) {
  var result = undefined;
  
  for (var obj of store) {
    for (var product of obj.products) {
      if (!result || product.quality > result.quality) {
        result = product;
      }
    }
  }
  return result;
},
store = [
  {
    products: [
    {
      quality: 1,
      info: 'info 1'
    },
    {
      quality: 2,
      info: 'info 2'
    },
    {
      quality: 3,
      info: 'info 3'
    }
   ]
  }
],
maxQualityProduct = maxQuality(store);
console.log(maxQualityProduct);