当前位置:  开发笔记 > 编程语言 > 正文

查找对象数组中属性的最大值

如何解决《查找对象数组中属性的最大值》经验,为你挑选了9个好方法。

我正在寻找一种非常快速,干净和有效的方法来获取以下JSON切片中的最大"y"值:

[
  {
    "x": "8/11/2009",
    "y": 0.026572007
  },
  {
    "x": "8/12/2009",
    "y": 0.025057454
  },
  {
    "x": "8/13/2009",
    "y": 0.024530916
  },
  {
    "x": "8/14/2009",
    "y": 0.031004457
  }
]

for循环是唯一可行的方法吗?我热衷于某种方式使用Math.max.



1> tobyodavies..:

要查找y对象的最大值array:

Math.max.apply(Math, array.map(function(o) { return o.y; }))


你能扩展这个答案来展示如何返回找到最大值的对象吗?那将是非常有帮助的,谢谢!
@MikeLyons如果您仍然关心获取实际对象:https://jsfiddle.net/45c5r246/34/
这是小提琴!希望这会对某人有所帮助https://jsfiddle.net/45c5r246/
FWIW我的理解是当你在函数上调用apply时,它执行具有指定值的函数`this`和一系列指定为数组的参数.诀窍是apply将数组转换为一系列实际的函数参数.所以在这种情况下,它最终调用`Math.max(0.0265,0.0250,0.024,0.031)`,执行的函数`this`为`Math`.我不明白为什么它应该是`Math`坦率地说,我认为这个函数不需要有效的`this`.哦,这是一个正确的解释:http://stackoverflow.com/questions/21255138/how-does-the-math-max-apply-work
请大家回答!
`Math.max.apply(Math,Array)`返回给定数组的最大值.`array.map(function(o){return oy;})`返回对象中y值的数组.然后在小提琴的第二行`array.find(function(o){return oy == valueReturnedByMathMax;})`中,你只需查找包含该最大值的对象.
Math.max(... array.map(o => oy))<3 thx to atom code formatter

2> Andy Polhill..:

在对象数组中查找属性"X"具有最大值的对象

一种方法是使用Array reduce ..

const max = data.reduce(function(prev, current) {
    return (prev.y > current.y) ? prev : current
}) //returns object

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce http://caniuse.com/#search=reduce(IE99及以上版本)

如果您不需要支持IE(仅限Edge),或者可以使用诸如Babel之类的预编译器,则可以使用更简洁的语法.

const max = data.reduce((prev, current) => (prev.y > current.y) ? prev : current)


请注意,这将返回对象中具有最大值而不是最大值的对象.这可能是也可能不是你想要的.就我而言,这就是我想要的.+1
这是一个很好的答案,但是,您希望传递初始值,否则在数据数组为空时会出错.即对象的自动增量索引.`const max = data.reduce((prev,current)=>(prev.y> current.y)?prev:current,1)`

3> 小智..:

干净简洁的ES6(巴别塔)

const maxValueOfY = Math.max(...arrayToSearchIn.map(o => o.y), 0);

如果arrayToSearchIn为空,则第二个参数应确保默认值.


当它为空数组返回`-Infinity`时,你可以传递**初始值**`Math.max(... state.allProjects.map(o => o.id),1);`
也很高兴知道它为空数组返回`-Infinity`(一个[truthy](https://developer.mozilla.org/en-US/docs/Glossary/Truthy)值)
这应该是现在接受的答案......绝对是更简洁的方法.

4> Guffa..:

好吧,首先你应该解析JSON字符串,以便你可以轻松访问它的成员:

var arr = $.parseJSON(str);

使用该map方法提取值:

arr = $.map(arr, function(o){ return o.y; });

然后你可以在max方法中使用数组:

var highest = Math.max.apply(this,arr);

或者作为一个单行:

var highest = Math.max.apply(this,$.map($.parseJSON(str), function(o){ return o.y; }));


它没有用`jQuery`标记
如果@tobyodavies忽略了它被标记为"json"的事实并没有多大关系 - 他在答案中没有使用外部JavaScript库:)

5> congusbongus..:

我想逐步解释简洁的接受答案:

var objects = [{ x: 3 }, { x: 1 }, { x: 2 }];

// array.map lets you extract an array of attribute values
var xValues = objects.map(function(o) { return o.x; });
// es6
xValues = Array.from(objects, o => o.x);

// function.apply lets you expand an array argument as individual arguments
// So the following is equivalent to Math.max(3, 1, 2)
// The first argument is "this" but since Math.max doesn't need it, null is fine
var xMax = Math.max.apply(null, xValues);
// es6
xMax = Math.max(...xValues);

// Finally, to find the object that has the maximum x value (note that result is array):
var maxXObjects = objects.filter(function(o) { return o.x === xMax; });

// Altogether
xMax = Math.max.apply(null, objects.map(function(o) { return o.x; }));
var maxXObject = objects.filter(function(o) { return o.x === xMax; })[0];
// es6
xMax = Math.max(...Array.from(objects, o => o.x));
maxXObject = objects.find(o => o.x === xMax);


document.write('

objects: ' + JSON.stringify(objects) + '

'); document.write('

xValues: ' + JSON.stringify(xValues) + '

'); document.write('

xMax: ' + JSON.stringify(xMax) + '

'); document.write('

maxXObjects: ' + JSON.stringify(maxXObjects) + '

'); document.write('

maxXObject: ' + JSON.stringify(maxXObject) + '

');


6> Kamil Kiełcz..:

处理负数大小写的树ONELINERS的比较(在a数组中输入):

var maxA = Math.max(...a.map(o=>o.y),a[0].y); // 33 chars time complexity: >O(2n)

var maxB = a.reduce((a,b)=>a.y>b.y?a:b).y;    // 30 chars time complexity:  O(n)

var maxC = a.sort((a,b)=>b.y-a.y)[0].y;       // 27 chars time complexity:  O(nlogn)

可编辑的示例在这里。想法来自:maxA,maxB,maxC(副作用:已更改a- sort已就位)。

var maxA = Math.max(...a.map(o=>o.y),a[0].y); // 33 chars time complexity: >O(2n)

var maxB = a.reduce((a,b)=>a.y>b.y?a:b).y;    // 30 chars time complexity:  O(n)

var maxC = a.sort((a,b)=>b.y-a.y)[0].y;       // 27 chars time complexity:  O(nlogn)


7> 小智..:
var data = [
  { 'name': 'Vins', 'age': 27 },
  { 'name': 'Jan', 'age': 38 },
  { 'name': 'Alex', 'age': 80 },
  { 'name': 'Carl', 'age': 25 },
  { 'name': 'Digi', 'age': 40 }
];
var max = data.reduce(function (prev, current) {
   return (prev.age > current.age) ? prev : current
});
//output = {'name': 'Alex', 'age': 80}



8> kmonsoor..:

如果你(或者这里有人)可以自由使用lodash实用程序库,它有一个maxBy函数,在你的情况下非常方便.

因此你可以这样使用:

_.maxBy(jsonSlice, 'y');



9> 小智..:

或者简单的排序!保持真实:)

array.sort((a,b)=>a.y

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有