Javascript 如何获取JSON数据的最小值、最大值和总和

Javascript 如何获取JSON数据的最小值、最大值和总和,javascript,arrays,Javascript,Arrays,我有JSON数据,返回时只有一个int值。经过一些更改,这些值现在以整数数组(以及原始格式)的形式返回 { “价值”:10, “价值”:70, “价值”:30, “价值”:200 } -及- { “价值”:[64,13,55,34,52,43,59,20,20], “价值”:[10,90,20,80,30,70,60,40,50] } 我有一个公式可以返回旧版本JSON数据的最小值、最大值和总和。现在它不起作用了,我也不知道重新编写函数来处理数组的最佳方法是什么。或者,如果让第二个函数只处理数

我有JSON数据,返回时只有一个int值。经过一些更改,这些值现在以整数数组(以及原始格式)的形式返回

{
“价值”:10,
“价值”:70,
“价值”:30,
“价值”:200
}
-及-
{
“价值”:[64,13,55,34,52,43,59,20,20],
“价值”:[10,90,20,80,30,70,60,40,50]
}
我有一个公式可以返回旧版本JSON数据的最小值、最大值和总和。现在它不起作用了,我也不知道重新编写函数来处理数组的最佳方法是什么。或者,如果让第二个函数只处理数组并检查它是int还是数组更好

是否有一种方法可以返回(从上面的数字):

//输入数据
const value=document.querySelectorAll(“div”).forEach(el=>{
const contents=el.textContent,//获取
json=json.parse(contents),//解析数据
jsonData=json.data;//仅获取数据
//使数据正常化
//@发件人:https://stackoverflow.com/a/67294607/1086990
常量normaliseData=arr=>{
const data=arr.map(({value})=>value);
返回arr[0]的类型。值=='number'?[data]:数据;
};
//加入常数
常量值数组=normaliseData(jsonData);
//获取最小/最大/和
const minMaxSum=valueArray.forEach(e=>{
返回[
Math.min(…e),
数学max(…e),
[…e].减少((v,w)=>v+w)
];
});
//输出
console.log(minMaxSum);
});

{“数据”:[{“值”:[64,23,45,34,52,43,59,40]},{“值”:[10,90,20,80,30,70,60,40,50]}
{“数据”:[{“值”:600},{“值”:70},{“值”:30}]}

您可以使用Math.max和Math.min查找数组的最大值和最小值,然后在特定变量中指定值

当前,当您使用
val.value
时,它由整个数组组成,因此您还需要迭代数组以查找最大值、最小值或和

要查找总和,请在val.value数组上使用
reduce
,然后将其添加到
acc[2]

//输入数据
const valueInArray=document.getElementById(“valueInArray”).innerHTML,
valueAsSingle=document.getElementById(“valueAsSingle”).innerHTML;
//解析
const jsonArray=JSON.parse(valueInArray),
jsonNumber=JSON.parse(valueAsSingle),
jsonArrayData=jsonArray.data,
jsonNumberData=jsonNumber.data;
//得到数字
const minMaxSumArray=jsonArrayData.reduce((acc,val)=>{
//最小数
acc[0]=(
(acc[0]==未定义的| |数学最小值(…val.value)acc[1])?
数学最大值(…值):acc[1]
)
//数之和
acc[2]=(
acc[2]==未定义?
价值减少((v,w)=>v+w):价值减少((v,w)=>v+w)+acc[2]
)
console.log('answer',acc)
//返回数组
返回acc;
}, [] );

{“数据”:[{“值”:[64,23,45,34,52,43,59,40]},{“值”:[10,90,20,80,30,70,60,40,50]}
{“数据”:[{“值”:10},{“值”:70},{“值”:30}]}

我的看法:首先,通过将所有值合并并使用Array.flat()将其展平,创建一个包含所有值(数组或单个值)的单个数组。然后使用减速机确定总和,并使用Math.min/max表示最小值和最大值

//输入数据
const valuesInArray=JSON.parse(
document.querySelector(“#valueInArray”).textContent.data;
const singleValues=JSON.parse(
document.querySelector(“#valueAsSingle”).textContent.data;
//将对象中的所有值获取到单个值数组中
//(so:将所有值转换为单个值)
const allValues=valuesInArray.map(v=>v.value)
.concat(singleValues.reduce((acc,val)=>[…acc,+val.value],]))
.flat();
//让我们看看我们有什么
log(`两个对象的所有值:${JSON.stringify(allValues)}`);
//创建总和、最小值和最大值
常数[总和、最小值、最大值][
allValues.reduce((a,v)=>a++v,0),
Math.min(…所有值),
最大值(…所有值)];
log(`From all values sum是${sum},min${min}和max${max}`)
div{
显示:无;
}

{“数据”:[
{“值”:[64,23,45,34,52,43,59,40]},
{“值”:[10,90,20,80,30,70,60,40,50]}]
}
{“数据”:
[{“值”:10},{“值”:70},{“值”:30}]
}

通过测试每个数组中第一个对象的值的类型来规范化数据:

const valueInArray = [{ value: [64, 23] }, { value: [45, 34] }];
const valueAsSingle = [{ value: 600 }, { value: 70 }];

const normalizeData = arr => {
  const data = arr.map(({ value }) => value);

  return typeof arr[0].value === 'number'
    ? [data]
    : data;
};

console.log(normalizeData(valueInArray));
//=> [ [ 64, 23 ], [ 45, 34 ] ]

console.log(normalizeData(valueAsSingle));
//=> [ [ 600, 70 ] ]

现在它们是相同的形状,因此可以平等对待它们。

对数组进行排序以获得其最小值/最大值是浪费周期。好的,让我们使用Math.min/max。虽然我怀疑Math.min/max也会循环,但应该会更优化@KooiInc在不合并所有数字的情况下,我如何使用它仅处理单个
数据
字符串?因此,如果将值作为
valueInArray
格式传递,它将获得每个值数组的最小值、最大值和。如果这些值作为
valueAsSingle
传递,它将从所有单个值中得到最小值、最大值和ints@markb也许第二个代码片段可以帮助你做到这一点?@KooiInc是的,只是你还在合并所有的值。我正试图按照json-隔离它们。我想这两种类型都可以通过。我想你是迷路了,因为你使用了
reduce
,里面有20行内容,而简单的3行循环也可以解决这个问题。@georg你如何将它简化为3行?这似乎行得通,但可能我在最初的帖子中没有看到。它不能同时处理两种类型的值(多个
值中的单个整数和数组整数),谢谢@Corey。在正常化之后,我似乎仍然有问题。如果你看这里,那么第25行
const valueInArray = [{ value: [64, 23] }, { value: [45, 34] }];
const valueAsSingle = [{ value: 600 }, { value: 70 }];

const normalizeData = arr => {
  const data = arr.map(({ value }) => value);

  return typeof arr[0].value === 'number'
    ? [data]
    : data;
};

console.log(normalizeData(valueInArray));
//=> [ [ 64, 23 ], [ 45, 34 ] ]

console.log(normalizeData(valueAsSingle));
//=> [ [ 600, 70 ] ]