我正在寻找一种非常快速,干净和有效的方法来获取以下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
.
要查找y
对象的最大值array
:
Math.max.apply(Math, array.map(function(o) { return o.y; }))
一种方法是使用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)
干净简洁的ES6(巴别塔)
const maxValueOfY = Math.max(...arrayToSearchIn.map(o => o.y), 0);
如果arrayToSearchIn
为空,则第二个参数应确保默认值.
好吧,首先你应该解析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; }));
我想逐步解释简洁的接受答案:
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) + '
');
处理负数大小写的树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)
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}
如果你(或者这里有人)可以自由使用lodash
实用程序库,它有一个maxBy函数,在你的情况下非常方便.
因此你可以这样使用:
_.maxBy(jsonSlice, 'y');
或者简单的排序!保持真实:)
array.sort((a,b)=>a.y