获取嵌套 JSON 对象的最小值和最大值
Posted
技术标签:
【中文标题】获取嵌套 JSON 对象的最小值和最大值【英文标题】:Get min and max of nested JSON object 【发布时间】:2019-05-08 00:04:55 【问题描述】:我有一个嵌套的 json 对象,看起来像---
[
"key":"AXCG","values":[
"interval":'1_to_2years',"value":34,
"interval":'3_to_4years',"value":12,
"interval":'5_to_6years',"value":45,
],
"key":"BDGT","values":[
"interval":'1_to_2years',"value":194,
"interval":'3_to_4years',"value":12,
"interval":'5_to_6years',"value":45,
],
"key":"YTEF","values":[
"interval":'1_to_2years',"value":0,
"interval":'3_to_4years',"value":12,
"interval":'5_to_6years',"value":15,
]]
我想找到值中的最小值和最大值。就像在这种情况下,它会是最小值 0 和最大值 194。我该怎么做?
【问题讨论】:
发布的问题似乎根本没有包含any attempt 来解决问题。 *** 期待您 try to solve your own problem first,因为您的尝试有助于我们更好地了解您想要什么。请编辑问题以显示您尝试过的内容,以说明您遇到minimal reproducible example 的特定障碍。欲了解更多信息,请参阅How to Ask 并拨打tour。 Array.reduce 就是你要找的。span> 顺便说一句,没有“JSON 对象”(或“JSON 数组”)之类的东西。 JSON 是一些数据结构的文本表示。 JSON 的格式类似于 javascript 语言,但它没有以任何方式链接到 JavaScript。 JSON 可以用多种语言处理。从您的问题中不清楚您发布的是JSON
还是 JavaScript 对象数组。由于它不是有效的 JSON,我认为它是一个 JavaScript 片段,并且附加到问题的标签 json
不正确。
【参考方案1】:
在下面找到您的用例的代码,
'use strict'
const collection = [
"key": "AXCG", "values": [
"interval": '1_to_2years', "value": 34 ,
"interval": '3_to_4years', "value": 12 ,
"interval": '5_to_6years', "value": 45 ,
]
,
"key": "BDGT", "values": [
"interval": '1_to_2years', "value": 194 ,
"interval": '3_to_4years', "value": 12 ,
"interval": '5_to_6years', "value": 45 ,
]
,
"key": "YTEF", "values": [
"interval": '1_to_2years', "value": 0 ,
"interval": '3_to_4years', "value": 12 ,
"interval": '5_to_6years', "value": 15 ,
]
]
const list = []
collection.every(e => e.values.every(e2 => list.push(e2.value)));
console.log('Max Value:: ' + Math.max.apply(null, list)); // 194
console.log('Min Value:: ' + Math.min.apply(null, list)); // 0
【讨论】:
【参考方案2】:
var collection = [
"key": "AXCG", "values": [
"interval": '1_to_2years', "value": 34 ,
"interval": '3_to_4years', "value": 12 ,
"interval": '5_to_6years', "value": 45 ,
]
,
"key": "BDGT", "values": [
"interval": '1_to_2years', "value": 194 ,
"interval": '3_to_4years', "value": 12 ,
"interval": '5_to_6years', "value": 45 ,
]
,
"key": "YTEF", "values": [
"interval": '1_to_2years', "value": 0 ,
"interval": '3_to_4years', "value": 12 ,
"interval": '5_to_6years', "value": 15 ,
]
];
var values = [];
collection.forEach(function (item)
item.values.forEach(function (nestedItem)
values.push(nestedItem.value);
);
);
console.log("Min:" + Math.min.apply(Math, values)); // Min:0
console.log("Max:" + Math.max.apply(Math, values)); // Max:194
【讨论】:
【参考方案3】:使用 Array.forEach 的简单想法的另一种变体:
var o = [
"key": "AXCG", "values": [
"interval": '1_to_2years', "value": 34 ,
"interval": '3_to_4years', "value": 12 ,
"interval": '5_to_6years', "value": 45 ,
]
,
"key": "BDGT", "values": [
"interval": '1_to_2years', "value": 194 ,
"interval": '3_to_4years', "value": 12 ,
"interval": '5_to_6years', "value": 45 ,
]
,
"key": "YTEF", "values": [
"interval": '1_to_2years', "value": 0 ,
"interval": '3_to_4years', "value": 12 ,
"interval": '5_to_6years', "value": 15 ,
]
];
var minimum = 9999;
var maximum = 0;
o.forEach(function (element)
var inner = element.values;
inner.forEach(function (innerELement)
if (innerELement.value < minimum) minimum = innerELement.value;
if (innerELement.value > maximum) maximum = innerELement.value;
);
);
console.log('Min is ' + minimum + ' and max is ' + maximum);
【讨论】:
【参考方案4】:您可以使用array#reduce
来获取value
在values
数组中的最小值和最大值。遍历values
数组的每个对象,并将值与存储的最小值和最大值进行比较,当遇到新的最小值和最大值时更新存储的值。
var collection = [ "key": "AXCG", "values": [ "interval": '1_to_2years', "value": 34 , "interval": '3_to_4years', "value": 12 , "interval": '5_to_6years', "value": 45 , ] , "key": "BDGT", "values": [ "interval": '1_to_2years', "value": 194 , "interval": '3_to_4years', "value": 12 , "interval": '5_to_6years', "value": 45 , ] , "key": "YTEF", "values": [ "interval": '1_to_2years', "value": 0 , "interval": '3_to_4years', "value": 12 , "interval": '5_to_6years', "value": 15, ] ],
result = collection.reduce((r,values) =>
values.forEach((value) =>
r.min = r.min > value ? value : r.min;
r.max = r.max < value ? value : r.max;
);
return r;
,min: Number.MAX_SAFE_INTEGER, max: Number.MIN_SAFE_INTEGER);
console.log(result);
【讨论】:
以上是关于获取嵌套 JSON 对象的最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章