Javascript 用深度求和数组的总和
我当然试着寻找一个具体的例子,或者一个例子来让我接近答案。我试图得到一个多深度的物体数组的和 我的数据结构如下:Javascript 用深度求和数组的总和,javascript,algorithm,recursion,sum,Javascript,Algorithm,Recursion,Sum,我当然试着寻找一个具体的例子,或者一个例子来让我接近答案。我试图得到一个多深度的物体数组的和 我的数据结构如下: [ { "values":[ { "values":[ { "value":{ "value":"51214.35"
[
{
"values":[
{
"values":[
{
"value":{
"value":"51214.35"
},
}
],
}
],
},
{
"values":[
{
"values":[
{
"value":{
"value":"10632.00"
},
},
{
"value":{
"value":"15000.00"
},
}
],
}
],
}
]
我想让它们成为每个对象的一个属性,每个对象都有更深入的所有值属性之和
例如:
[
{
"total":"51214.35",
"values":[
{
"total":"51214.35",
"values":[
{
"total":"51214.35",
"value":{
"value":"51214.35"
},
}
],
}
],
},
{
"total":"25632.00",
"values":[
{
"total" : "25632.00",
"values":[
{
"total": "10632.00",
"value":{
"value":"10632.00"
},
},
{
"total": "15000.00",
"value":{
"value":"15000.00"
},
}
],
}
],
}
]
我知道递归可能会起作用,因为有一个未知的深度 您可以创建一个函数,该函数接受一个对象,如果该对象具有
值,则将其设置为其totals
属性。如果它没有对数组中的每个项调用相同函数的总数值
你需要小心求和,因为你有字符串而不是数字作为值,否则它是非常简单的递归
let arr=[{“value”:[{“value”:[{“value”:{“value”:{“value”:“51214.35”}、}、}、}、{“value”:[{“value”:{“value”:{“value”:{“value”:“15000.00”}、}、}、}、}、}、}]
函数集合总计(obj){
obj.totals=obj.hasOwnProperty('值')
?parseFloat(对象值值)
:对象值。减少((总和,项目)=>总和+集合总计(项目),0)
返回对象总数
}
arr.forEach(项目=>setTotals(项目))
console.log(arr)
您可以创建一个函数,该函数接受一个对象,如果该对象有一个值,则将其设置为其totals
属性。如果它没有对数组中的每个项调用相同函数的总数值
你需要小心求和,因为你有字符串而不是数字作为值,否则它是非常简单的递归
let arr=[{“value”:[{“value”:[{“value”:{“value”:{“value”:“51214.35”}、}、}、}、{“value”:[{“value”:{“value”:{“value”:{“value”:“15000.00”}、}、}、}、}、}、}]
函数集合总计(obj){
obj.totals=obj.hasOwnProperty('值')
?parseFloat(对象值值)
:对象值。减少((总和,项目)=>总和+集合总计(项目),0)
返回对象总数
}
arr.forEach(项目=>setTotals(项目))
控制台日志(arr)
const值=[
{
“价值观”:[
{
“价值观”:[
{
“价值”:{
“值”:“51214.35”
},
}
],
}
],
},
{
“价值观”:[
{
“价值观”:[
{
“价值”:{
“值”:“10632.00”
},
},
{
“价值”:{
“价值”:“15000.00”
},
}
],
}
],
}
];
const total=values=>values.reduce((t,i)=>{
const currentTotal=i.value?t+parseFloat(i.value.value):i.values?t+total(i.values):t;
i、 总计=当前总计;
返回总电流;
}, 0);
总数(价值);
console.log(值)代码>
const值=[
{
“价值观”:[
{
“价值观”:[
{
“价值”:{
“值”:“51214.35”
},
}
],
}
],
},
{
“价值观”:[
{
“价值观”:[
{
“价值”:{
“值”:“10632.00”
},
},
{
“价值”:{
“价值”:“15000.00”
},
}
],
}
],
}
];
const total=values=>values.reduce((t,i)=>{
const currentTotal=i.value?t+parseFloat(i.value.value):i.values?t+total(i.values):t;
i、 总计=当前总计;
返回总电流;
}, 0);
总数(价值);
console.log(值)代码>请尝试以下操作:
函数calcTotal(数据){
if(Array.isArray(data))data.map(calcTotal)
设总数=0
如果(data.hasOwnProperty('values'))总计=data.values.map(calcTotal).reduce((acc,v)=>acc+v.total,0)
如果(data.hasOwnProperty('value'))总计=parseFloat(data.value.value)
返回Object.assign(数据,{total})
}(数据)
试试这个:
函数calcTotal(数据){
if(Array.isArray(data))data.map(calcTotal)
设总数=0
如果(data.hasOwnProperty('values'))总计=data.values.map(calcTotal).reduce((acc,v)=>acc+v.total,0)
如果(data.hasOwnProperty('value'))总计=parseFloat(data.value.value)
返回Object.assign(数据,{total})
}(数据)
第二个对象的总值应为25632.00
,但这会产生76846.35
,但您已将该总值附加到数组中的第二个对象-值[1]。总值为76846.35
这不是OP要求的值,也不是值[1]的总和
第二个对象的总值应为25632.00
,但这会产生76846.35
,但您已将该总值附加到数组中的第二个对象-值[1]。总值为76846.35
这不是OP要求的值,也不是值[1]