Javascript 不返回对象值和的递归函数
为什么Javascript 不返回对象值和的递归函数,javascript,Javascript,为什么sum是未定义的。我做错了什么 var testData1=[{ “姓名”:“医生”, “类别”:“医生”, “子类别”:[{ “姓名”:“喜欢”, “类别”:“喜欢”, “子类别”:[{ “姓名”:“访问”, “类别”:“访问”, “子类别”:[{ “姓名”:“费用”, “类别”:“费用”, “子类别”:空, “val”:30 }] }] }, { “姓名”:“不喜欢”, “类别”:“不喜欢”, “子类别”:[{ “名称”:“质量”, “类别”:“质量”, “子类别”:[{ “姓名”:
sum
是未定义的
。我做错了什么
var testData1=[{
“姓名”:“医生”,
“类别”:“医生”,
“子类别”:[{
“姓名”:“喜欢”,
“类别”:“喜欢”,
“子类别”:[{
“姓名”:“访问”,
“类别”:“访问”,
“子类别”:[{
“姓名”:“费用”,
“类别”:“费用”,
“子类别”:空,
“val”:30
}]
}]
}, {
“姓名”:“不喜欢”,
“类别”:“不喜欢”,
“子类别”:[{
“名称”:“质量”,
“类别”:“质量”,
“子类别”:[{
“姓名”:“任命”,
“类别”:“任命”,
“子类别”:空,
“瓦尔”:50
}, {
“姓名”:“护理”,
“类别”:“护理”,
“子类别”:空,
“val”:70
}, {
“姓名”:“注意”,
“类别”:“专注”,
“子类别”:空,
“val”:90
}]
}]
}, {
“名称”:“中性”,
“类别”:“中性”,
“子类别”:[{
“姓名”:“专业人士”,
“类别”:“专业”,
“子类别”:[{
“名称”:“轻松”,
“类别”:“轻松”,
“子类别”:空,
“瓦尔”:50
}, {
“姓名”:“有能力”,
“类别”:“合格”,
“子类别”:空,
“val”:40
}, {
“名称”:“可用性”,
“类别”:“可用性”,
“子类别”:空,
“val”:80
}]
}]
}],
“索引”:6
}, {
“名称”:“服务”,
“类别”:“服务”,
“子类别”:[{
“姓名”:“喜欢”,
“类别”:“喜欢”,
“子类别”:[{
“名称”:“环境”,
“类别”:“环境”,
“子类别”:[{
“姓名”:“专业精神”,
“类别”:“专业性”,
“子类别”:空,
“瓦尔”:50
}, {
“名称”:“房间”,
“类别”:“房间”,
“子类别”:空,
“val”:30
}, {
“名称”:“停车场”,
“类别”:“停车场”,
“子类别”:空,
“val”:20
}]
}, {
“名称”:“可用性”,
“类别”:“可用性”,
“子类别”:[{
“姓名”:“有能力”,
“类别”:“合格”,
“子类别”:空,
“val”:30
}]
}]
}, {
“姓名”:“不喜欢”,
“类别”:“不喜欢”,
“子类别”:[{
“名称”:“管理层”,
“类别”:“管理”,
“子类别”:[{
“姓名”:“工作人员”,
“类别”:“工作人员”,
“子类别”:空,
“瓦尔”:50
}, {
“名称”:“操作”,
“类别”:“操作”,
“子类别”:空,
“val”:70
}]
}, {
“姓名”:“护士”,
“类别”:“护士”,
“子类别”:[{
“名称”:“药物”,
“类别”:“药物”,
“子类别”:空,
“val”:30
}]
}]
}, {
“名称”:“中性”,
“类别”:“中性”,
“子类别”:[{
“名称”:“服务”,
“类别”:“服务”,
“子类别”:[{
“姓名”:“花了很长时间”,
“类别”:“花费了很长时间”,
“子类别”:空,
“瓦尔”:50
}, {
“姓名”:“粗鲁”,
“类别”:“粗鲁”,
“子类别”:空,
“val”:40
}, {
“姓名”:“就座”,
“类别”:“坐姿”,
“子类别”:空,
“val”:80
}]
}]
}],
“索引”:16
}];
函数addSum(数据){
data.forEach(函数(d,索引){
if(Array.isArray(d.subCategory)){
返回值(0+addSum(d.子类别));
}否则{
document.write(''+JSON.stringify(d.val,0,4)+'');
返回d.val;
}
});
}
var sum=addSum(testData1);
警报(总和)
您的返回不属于addSum
,它属于forEach
,这就是为什么addSum
不返回任何内容(未定义)。Array.prototype.forEach
不期望返回值,不能用于计算总和或其他内容
您可以利用Array.prototype.reduce
实现您的结果:
var sum = arr => arr.reduce((a, b) => Array.isArray(b.subCategory)
? a + sum(b.subCategory)
: a + b.val, 0);
或使用ECMAScript 6箭头函数:
function addSum(data) {
return data.reduce(function (p, c) {
return p + (Array.isArray(c.subCategory) ? addSum(c.subCategory) : c.val);
}, 0);
}
正在工作。从您不能返回值,这就是为什么您得到未定义的
,对于这种情况更合适的方法
或者,如果您想使用.forEach
,您可以这样做
function addSum(data,tot) {
tot = tot || 0;
data.forEach(function(d, index) {
if (Array.isArray(d.subCategory)) {
tot = addSum(d.subCategory, tot);
} else {
tot += parseInt(d.val);
document.write('<pre>' + d.val + ' - ' + tot + ' </pre>');
}
});
return tot;
}
您不能从foreach返回,只能从函数返回。以下是您的函数的工作版本:
函数addSum(数据,tot){
tot=tot | | 0;
data.forEach(函数(d,索引){
if(Array.isArray(d.subCategory)){
tot=总和(d.子类别,tot);
}否则{
tot+=parseInt(d.val);
文件。写入(“”+d.val+“”-“”+tot+“”);
}
});
返回tot;
}
和一个jsfiddle:
我同意应该将其简化为reduce函数,但我认为这也有助于了解如何修改您所做的操作以使其工作。foreach函数中的Return用于回调,而不是从
addSum()函数返回。在这种情况下,Foreach回调返回没有帮助。相反,使用一些外部变量来保持总和就可以了
下面更新的代码在addSum()
函数中定义了一个变量sum
,并向其添加递归调用的返回值。函数现在将在结尾返回计算出的和
var testData1=[{
“姓名”:“医生”,
“类别”:“医生”,
“子类别”:[{
“姓名”:“喜欢”,
“类别”:“喜欢”,
“子类别”:[{
“姓名”:“访问”,
“类别”:“访问”,
“子类别”:[{
“姓名”:“费用”,
“类别”:“费用”,
“子类别”:空,
“val”:30
}]
}]
}, {
“姓名”:“不喜欢”,
“类别”:“不喜欢”,
“子类别”:[{
“名称”:“质量”,
“类别”:“Qua”
function addSum(data) {
return function sum(data, result) {
data.forEach(function (element) {
result = Array.isArray(element.subCategory)
? sum(element.subCategory, result)
: result + element.val;
});
return result;
}(data, 0);
}
function addSum(data,tot) {
tot = tot || 0;
data.forEach(function(d, index) {
if (Array.isArray(d.subCategory)) {
tot = addSum(d.subCategory, tot);
} else {
tot += parseInt(d.val);
document.write('<pre>' + d.val + ' - ' + tot + ' </pre>');
}
});
return tot;
}