我正在尝试创建一个 JavaScript 函数,该函数从外部 JSON 中的数组获取信息,然后获取其中一个 JSON 变量的最大值(或前 5 个值)。对于此示例,假设我想要获取值“ppg”的最大值。这是数组的一个小样本:
[
{
"player" : "Andre Drummond",
"team" : "Detroit Pistons",
"ppg" : "15.4",
"rpg" : "11.6",
"apg" : "2.4",
"bpg" : "1.6",
"spg" : "0.8",
"3pg" : "0.1"
},
{
"player" : "Anthony Davis",
"team" : "New Orleans Pelicans",
"ppg" : "16.4",
"rpg" : "13.6",
"apg" : "2.6",
"bpg" : "3.5",
"spg" : "1.2",
"3pg" : "0.1"
},
{
"player" : "Carmelo Anthony",
"team" : "New York Knicks",
"ppg" : "27.4",
"rpg" : "5.4",
"apg" : "4.5",
"bpg" : "1.1",
"spg" : "1.5",
"3pg" : "1.6"
}
]
遍历数组获取最大值然后从该值获取“玩家”和“团队”值的最佳方法是什么?该页面将是交互式的,因为我将有一个下拉菜单栏,允许查看者在“玩家”和“团队”之外的六个 JSON 值之一之间进行选择。预先感谢!
只需循环遍历数组,并随时跟踪最大值:
function getMax(arr, prop) {
var max;
for (var i=0 ; i<arr.length ; i++) {
if (max == null || parseInt(arr[i][prop]) > parseInt(max[prop]))
max = arr[i];
}
return max;
}
用法如下:
var maxPpg = getMax(arr, "ppg");
console.log(maxPpg.player + " - " + maxPpg.team);
编辑
您还可以使用Javascript “sort”方法来获取前n个值:
function getTopN(arr, prop, n) {
// clone before sorting, to preserve the original array
var clone = arr.slice(0);
// sort descending
clone.sort(function(x, y) {
if (x[prop] == y[prop]) return 0;
else if (parseInt(x[prop]) < parseInt(y[prop])) return 1;
else return -1;
});
return clone.slice(0, n || 1);
}
用途:
var topScorers = getTopN(arr, "ppg", 2);
topScorers.forEach(function(item, index) {
console.log("#" + (index+1) + ": " + item.player);
});
我发现以下方法非常简洁:
arr.sort(
function(a, b) {
return parseFloat(b['ppg']) - parseFloat(a['ppg']);
}
)[0]['player']
片段中的演示:
var arr =[
{
"player" : "Andre Drummond",
"team" : "Detroit Pistons",
"ppg" : "15.4",
"rpg" : "11.6",
"apg" : "2.4",
"bpg" : "1.6",
"spg" : "0.8",
"3pg" : "0.1"
},
{
"player" : "Anthony Davis",
"team" : "New Orleans Pelicans",
"ppg" : "16.4",
"rpg" : "13.6",
"apg" : "2.6",
"bpg" : "3.5",
"spg" : "1.2",
"3pg" : "0.1"
},
{
"player" : "Carmelo Anthony",
"team" : "New York Knicks",
"ppg" : "27.4",
"rpg" : "5.4",
"apg" : "4.5",
"bpg" : "1.1",
"spg" : "1.5",
"3pg" : "1.6"
}
]
console.log(
arr.sort(
function(a, b) {
return parseFloat(b['ppg']) - parseFloat(a['ppg']);
}
)[0]['player']
);
首先,我按降序对数组进行排序,然后选择包含最大值的第一个元素。在代码中,我找到了具有最大
player
值的 ppg
。希望这有帮助!
这应该有效:
var highestValue = 0; //keep track of highest value
//loop through array of objects
for (var i=0, len = ary.length; i<len; i++) {
var value = Number(ary[i]["ppg"]);
if (value > highestValue) {
highestValue = value;
}
}
您可能会发现这个
sortByAttribute
功能很有用。只需按要排序的字符串传入属性,它就会返回具有您要查找的特定属性的最大值的任何对象。它仍然会返回整个数组,只是按您指定的属性升序排序。
var myArr = [
{
"player" : "Andre Drummond",
"team" : "Detroit Pistons",
"ppg" : "15.4",
"rpg" : "11.6",
"apg" : "2.4",
"bpg" : "1.6",
"spg" : "0.8",
"3pg" : "0.1"
},
{
"player" : "Anthony Davis",
"team" : "New Orleans Pelicans",
"ppg" : "16.4",
"rpg" : "13.6",
"apg" : "2.6",
"bpg" : "3.5",
"spg" : "1.2",
"3pg" : "0.1"
},
{
"player" : "Carmelo Anthony",
"team" : "New York Knicks",
"ppg" : "27.4",
"rpg" : "5.4",
"apg" : "4.5",
"bpg" : "1.1",
"spg" : "1.5",
"3pg" : "1.6"
}
]
function sortByAttribue(arr, attribute) {
return arr.sort(function(a,b) {
return a[attribute] < b[attribute];
});
}
sortByAttribue(myArr, "3pg") // returns Carmelo Anthony first
sortByAttribue(myArr, "bpg") // returns Anthony Davis first
function getMaxOfJson(jsonalreadyparsed, property) {
var max = null;
for (var i=0 ; i<jsonalreadyparsed.length ; i++) {
if(max == null){
max = jsonalreadyparsed[i][property];
} else {
if (parseFloat(jsonalreadyparsed[i][property]) > max){
max = jsonalreadyparsed[i][property];
}
}
}
return max;
}
这对我有用。
寻找具有特定属性'x最大值的项目的函数:
function getMax(array, propName) {
var max = 0;
var maxItem = null;
for(var i=0; i<array.length; i++) {
var item = array[i];
if(item[propName] > max) {
max = item[propName];
maxItem = item;
}
}
return maxItem;
}
用途:
$(document).ready(function() {
$('#getMaxBtn').click(function() {
var max = getMax(jsonArray, 'ppg');
alert(max.player);
});
});
这将允许您选择您想要的统计数据以及您想要返回的信息。
http://jsbin.com/tudegofa/1/edit
data => 是数组
stat => 是您要排序的统计数据
info => 是您想要返回的属性数组。
function getValues (data, stat, info)
{
var selectedValues = data.map(function(x) {
return parseFloat(x[stat]);
})
var i = selectedValues.indexOf(Math.max.apply(Math, selectedValues));
var result = {};
info.forEach(function(x) {
result[x] = test[i][x];
})
return result;
}
var myData = '';
$.getJSON('/url/to/grab/json', function(data) {
myData = data;
});
getValues(myData, "bpg", ["player","team"]);
//[object Object] {
// player: "Anthony Davis",
// team: "New Orleans Pelicans"
// }
从长远来看,简单谢谢你。
function getMaxValueByAttribute(arr, attr) {
var max = "-99999999999";
arr.forEach(function (member, index) {
// console.log(member, index);
if (member.hasOwnProperty(attr) && parseFloat(member[attr]) > parseFloat(max)) {
max = member[attr];
// console.log("Max now: " + max);
}
});
return max;
}
然后像这样使用它:
var result = getMaxValueByAttribute(arr, "ppg");
// result = "27.4"
您可以通过lodash轻松完成。
var players = [{
"player": "Andre Drummond",
"team": "Detroit Pistons",
"ppg": "15.4",
"rpg": "11.6",
"apg": "2.4",
"bpg": "1.6",
"spg": "0.8",
"3pg": "0.1"
},
{
"player": "Anthony Davis",
"team": "New Orleans Pelicans",
"ppg": "16.4",
"rpg": "13.6",
"apg": "2.6",
"bpg": "3.5",
"spg": "1.2",
"3pg": "0.1"
},
{
"player": "Carmelo Anthony",
"team": "New York Knicks",
"ppg": "27.4",
"rpg": "5.4",
"apg": "4.5",
"bpg": "1.1",
"spg": "1.5",
"3pg": "1.6"
}
];
var topscorer = _
.chain(players)
.sortBy('ppg')
.reverse()
.map(function(o) {
return 'Top scorer: ' + o.player + ' - ' + o.team;
})
.head()
.value();
console.log(topscorer);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.core.min.js"></script>
或更短:
var players = [{
"player": "Andre Drummond",
"team": "Detroit Pistons",
"ppg": "15.4",
"rpg": "11.6",
"apg": "2.4",
"bpg": "1.6",
"spg": "0.8",
"3pg": "0.1"
},
{
"player": "Anthony Davis",
"team": "New Orleans Pelicans",
"ppg": "16.4",
"rpg": "13.6",
"apg": "2.6",
"bpg": "3.5",
"spg": "1.2",
"3pg": "0.1"
},
{
"player": "Carmelo Anthony",
"team": "New York Knicks",
"ppg": "27.4",
"rpg": "5.4",
"apg": "4.5",
"bpg": "1.1",
"spg": "1.5",
"3pg": "1.6"
}
];
console.log(_.maxBy(players, 'ppg').player);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
我的解决方案在这里。请记住使用
==
而不是 ===
来比较数字与字符串。
const getMax = (arr, prop) => {
const tmp = arr.map(x => x[prop]);
const max = Math.max(...tmp);
return arr.filter(x => x[prop] == max);
}
getMax(myArr,"bpg")
单行版本:
myArr.filter( x => x["bpg"] == Math.max(...myArr.map(x => x["bpg"])) )
更简单:
const players =
[ { player: 'Andre Drummond', team: 'Detroit Pistons', ppg: '15.4', rpg: '11.6', apg: '2.4', bpg: '1.6', spg: '0.8', '3pg': '0.1' }
, { player: 'Anthony Davis', team: 'New Orleans Pelicans', ppg: '16.4', rpg: '13.6', apg: '2.6', bpg: '3.5', spg: '1.2', '3pg': '0.1' }
, { player: 'Carmelo Anthony', team: 'New York Knicks', ppg: '27.4', rpg: '5.4', apg: '4.5', bpg: '1.1', spg: '1.5', '3pg': '1.6' }
]
const getPlayerMax_on = cod => players.reduce((a,c)=>((+a[cod])<(+c[cod]))?c:a)
const maxOn_ppg = getPlayerMax_on('ppg')
console.log( maxOn_ppg.player, maxOn_ppg.team, maxOn_ppg.ppg )
Lodash MaxBy
例如
var players = [{
"name": "marvin",
"age": "21"
},
{
"name": "Lucy",
"age": "26"
},
{
"name": "james",
"age": "21"
}
];
maxBy(Players, 'age')
如果它是原始 json 对象,即
maxBy(JSON.parse(Players), 'age')
=>
{"name": "Lucy","age": "26"},
您甚至可以只返回年龄,即
maxBy(Players, 'age').age
=>
26
const arr = [
{
"player" : "Andre Drummond",
"team" : "Detroit Pistons",
"ppg" : "15.4",
"rpg" : "11.6",
"apg" : "2.4",
"bpg" : "1.6",
"spg" : "0.8",
"3pg" : "0.1"
},
{
"player" : "Anthony Davis",
"team" : "New Orleans Pelicans",
"ppg" : "16.4",
"rpg" : "13.6",
"apg" : "2.6",
"bpg" : "3.5",
"spg" : "1.2",
"3pg" : "0.1"
},
{
"player" : "Carmelo Anthony",
"team" : "New York Knicks",
"ppg" : "27.4",
"rpg" : "5.4",
"apg" : "4.5",
"bpg" : "1.1",
"spg" : "1.5",
"3pg" : "1.6"
}
];
const maxValue = arr.reduce((n, {rpg}) => parseFloat(n) > parseFloat(rpg) ? parseFloat(n) : parseFloat(rpg), 0)
console.log(maxValue)