【问题标题】:Javascript get object from array having min value and min value is needs to find and then find objectJavascript从具有最小值和最小值的数组中获取对象需要查找然后查找对象
【发布时间】:2017-03-28 07:11:36
【问题描述】:

我有对象数组中的对象有不同的键,所以我希望对象在该数组中具有最小值

list = [
{
'id':4,
'name':'nitin',
'group':'angularjs'
},
{
'id':1,
'name':'nitin',
'group':'angularjs'
},
{
'id':2,
'name':'nitin',
'group':'angularjs'
},
{
'id':3,
'name':'nitin',
'group':'angularjs'
}]

我试过了

var minValue = Math.min.apply(Math, list.map(function (o) {
                return o.id;
            }))

但它只返回 id 而不是整个对象,然后我必须为获取对象制作更多过滤器

有没有直接找对象的方法?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

你可以使用数组reduce方法:

var list = [
{
'id':4,
'name':'nitin',
'group':'angularjs'
},
{
'id':1,
'name':'nitin',
'group':'angularjs'
},
{
'id':2,
'name':'nitin',
'group':'angularjs'
},
{
'id':3,
'name':'nitin',
'group':'angularjs'
}];

var result = list.reduce(function(res, obj) {
    return (obj.id < res.id) ? obj : res;
});

console.log(result);

【讨论】:

    【解决方案2】:

    使用Array#reduce()

    list = [{
        'id': 4,
        'name': 'nitin',
        'group': 'angularjs'
      },
      {
        'id': 1,
        'name': 'nitin',
        'group': 'angularjs'
      },
      {
        'id': 2,
        'name': 'nitin',
        'group': 'angularjs'
      },
      {
        'id': 3,
        'name': 'nitin',
        'group': 'angularjs'
      }
    ];
    
    let min = list.reduce((prev, curr) => prev.id < curr.id ? prev : curr);
    
    console.log(min);

    【讨论】:

      【解决方案3】:

      您可以通过像这样循环遍历数组来检查具有最低 id 的对象,这可能不是最简洁的方式,但无论哪种方式都是一种解决方案:

      var list = [
      {
      'id':4,
      'name':'nitin',
      'group':'angularjs'
      },
      {
      'id':1,
      'name':'nitin',
      'group':'angularjs'
      },
      {
      'id':2,
      'name':'nitin',
      'group':'angularjs'
      },
      {
      'id':3,
      'name':'nitin',
      'group':'angularjs'
      }]
      
      var tmp = list[0].id;
      
      list.forEach(function (entry) {
          if (entry.id < tmp) {
          tmp = entry;
        }
      });
      
      console.log(tmp);
      

      https://jsfiddle.net/camgssk3/

      【讨论】:

      • 这里似乎有一个错字,当你初始化 tmp var 时你指向的是 id 而不是实体,建议修复:var tmp = list[0]; list.forEach(function (entry) { if (entry.id &lt; tmp.id) { tmp = entry; } }); console.log(tmp);
      【解决方案4】:

      其他选项可能是过滤您的数组,因为您已经有 min "id"

      var list = [
      {
      'id':4,
      'name':'nitin',
      'group':'angularjs'
      },
      {
      'id':1,
      'name':'nitin',
      'group':'angularjs'
      },
      {
      'id':2,
      'name':'nitin',
      'group':'angularjs'
      },
      {
      'id':3,
      'name':'nitin',
      'group':'angularjs'
      }];
      var min = Math.min.apply(Math, list.map(function (o) {
                      return o.id;
                  }));
      filtered = list.filter(function(elem){
        if(elem.id == min){console.log(elem);return elem;}
      })

      【讨论】:

      • 问题已经提到根据Math.min()的结果过滤原始数组,并明确要求更直接的方法。
      【解决方案5】:

      我用 Array.reduce 尝试了这些解决方案,但没有一个是完全证明的。它们不处理数组为空或只有 1 个元素的情况。

      这对我有用:

      const result = array.reduce(
          (prev, current) =>
            (prev?.id ?? current?.id) >= current?.id ? current : prev,
          null,
        );
      

      如果数组为空则返回null,其他情况处理好。

      【讨论】:

        猜你喜欢
        • 2021-12-28
        • 2018-04-08
        • 2021-12-10
        • 2021-12-09
        • 1970-01-01
        • 2019-04-22
        • 1970-01-01
        • 2021-12-14
        • 2015-03-15
        相关资源
        最近更新 更多