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

时间:2016-09-09 23:40:48

标签: javascript arrays

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

以下代码会注销所有子对象。我如何只返回质量最高的那个?



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);




4 个答案:

答案 0 :(得分:2)

您可以使用阵列上的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并且将小于任何其他产品但是,对于更复杂的结构或比较,您可能需要将数组中的实际项目作为种子。

答案 1 :(得分:1)

虽然另一个.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);
}

答案 2 :(得分:0)

我想这归结为一种简单的Array.prototype.sort类:

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

答案 3 :(得分: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);