Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不返回对象值和的递归函数_Javascript - Fatal编程技术网

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;
}