在Javascript中获取数组中具有最小值的对象,需要找到最小值并找到对象。

9

我有一个对象数组,其中每个对象都有不同的键,因此我想要在该数组中具有最小值的对象。

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对象数组以获取最小/最大值的重复问题。 - Kapila Perera
5个回答

12

你可以使用数组的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);


6

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


1

我尝试过使用Array.reduce这些解决方案,但它们都不完美。它们不能处理数组为空或只有一个元素的情况。

相反,以下内容对我有效:

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

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


0
您可以通过循环数组来查找具有最低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变量时,你指向的是id而不是实体,建议修复:var tmp = list[0]; list.forEach(function (entry) { if (entry.id < tmp.id) { tmp = entry; } }); console.log(tmp); - Kevin K.

0

另一个选项可能是过滤您的数组,因为您已经有了最小的“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() 的结果过滤原始数组,并明确要求更直接的方法。 - nnnnnn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接