Javascript 理解递归遍历,of和reduce示例

Javascript 理解递归遍历,of和reduce示例,javascript,Javascript,我试图理解递归的横截 我偶然发现他们写了这样的例子 let company={//同一个对象,为简洁起见进行了压缩 销售额:[{姓名:约翰,工资:1000},{姓名:爱丽丝,工资:600}], 发展:{ 网站:[{姓名:'Peter',工资:2000},{姓名:'Alex',工资:1800}], 内部人员:[{姓名:“杰克”,工资:1300}] } }; //做这项工作的功能 薪酬职能(部门){ if(Array.isArray(department)){//case(1) 返回部门.redu

我试图理解递归的横截

我偶然发现他们写了这样的例子

let company={//同一个对象,为简洁起见进行了压缩
销售额:[{姓名:约翰,工资:1000},{姓名:爱丽丝,工资:600}],
发展:{
网站:[{姓名:'Peter',工资:2000},{姓名:'Alex',工资:1800}],
内部人员:[{姓名:“杰克”,工资:1300}]
}
};
//做这项工作的功能
薪酬职能(部门){
if(Array.isArray(department)){//case(1)
返回部门.reduce((上一个,当前)=>上一个+当前.salary,0);//对数组求和
}else{//案例(2)
设和=0;
for(让对象值的子部门(部门)){
sum+=sumSalaries(subdep);//递归调用子部门,对结果求和
}
回报金额;
}
}
警报(Summary(公司));//6700
部门
不是数组时,它会迭代这些值。什么时候发工资 首先使用
company
调用,我们使用这行代码,因为
company
不是数组。
company
的值是
sales
数组和
development
对象-这些值都传递到
summarys

让我们看一个简化的例子,说明逻辑如何处理纯数值:

const test = {
  sites: 3800,
  internals: 1300
}

let sum = 0;
for (let aggSalaries of Object.values(test)) {
  sum += aggSalaries;
}
console.log(sum)
5100

我建议将代码简化为:

const公司={
销售额:[{姓名:约翰,工资:1000},{姓名:爱丽丝,工资:600}],
发展:{
网站:[{姓名:'Peter',工资:2000},{姓名:'Alex',工资:1800}],
内部人员:[{姓名:“杰克”,工资:1300}]
}
};
薪酬职能(部门){
返回数组.isArray(部门)
?部门减少((上一个,{salary})=>上一个+salary,0)
:Object.values(department).reduce((memo,value)=>memo+summaries(value),0);
}
控制台日志(公司)
部门
不是数组时,它会迭代这些值。什么时候发工资 首先使用
company
调用,我们使用这行代码,因为
company
不是数组。
company
的值是
sales
数组和
development
对象-这些值都传递到
summarys

让我们看一个简化的例子,说明逻辑如何处理纯数值:

const test = {
  sites: 3800,
  internals: 1300
}

let sum = 0;
for (let aggSalaries of Object.values(test)) {
  sum += aggSalaries;
}
console.log(sum)
5100

我建议将代码简化为:

const公司={
销售额:[{姓名:约翰,工资:1000},{姓名:爱丽丝,工资:600}],
发展:{
网站:[{姓名:'Peter',工资:2000},{姓名:'Alex',工资:1800}],
内部人员:[{姓名:“杰克”,工资:1300}]
}
};
薪酬职能(部门){
返回数组.isArray(部门)
?部门减少((上一个,{salary})=>上一个+salary,0)
:Object.values(department).reduce((memo,value)=>memo+summaries(value),0);
}

控制台日志(公司)让我们逐步浏览代码:

1) 功能
接受一个参数。最初这将是一个对象
公司
,但在对象属性的连续迭代中,这将是一个数组或对象

2) 状况 我们有一个条件要满足。如果参数是数组,请使用
reduce
对薪资值求和。最初,
公司
对象不满足此条件

sales
数组,以及
department
对象中的两个数组都将满足此条件

3)
reduce
reduce
接受初始值0,该值在每次迭代时始终是回调函数的第一个参数。在这种情况下,它被称为
prev
,但可以很容易地被称为
acc
,例如,用于“累加器”或
sum
。第二个参数
current
是数组中的当前元素

重要提示:这些数组中的元素都是对象

因此,我们从传入
prev
的0和
current
中的第一个数组对象开始,然后将该对象的salary属性中的值加为零。该值在下一次迭代中作为
prev
参数传入。我们不断地向这个值添加,直到没有更多的元素可以迭代,然后返回结果

4) 如果不符合条件
公司
对象和
开发
对象都符合此条件

5) 迭代函数调用 在第一次迭代中,我们在
公司
上循环。它的值是一个数组(
sales
)和另一个对象(
development
)。数组和对象被反馈到函数中。数组减少,值添加到
sum
,对象命中再次满足此条件,每个数组(
站点
内部
)再次反馈到函数中,其结果减少并添加到sum中


就这样!希望能有所帮助。

让我们逐步了解代码:

1) 功能
接受一个参数。最初这将是一个对象
公司
,但在对象属性的连续迭代中,这将是一个数组或对象

2) 状况 我们有一个条件要满足。如果参数是数组,请使用
reduce
对薪资值求和。最初,
公司
对象不满足此条件

sales
数组,以及
department
对象中的两个数组都将满足此条件

3)
reduce
reduce
接受初始值0,该值在每次迭代时始终是回调函数的第一个参数。在这种情况下,它被称为
prev
,但可能是eas
function sumSalaries(department) {
  if (Array.isArray(department)) {
    return department.reduce((prev, current) => prev + current.salary, 0);
  } else {
    let sum = 0;
    for (let subdep of Object.values(department)) {
      sum += sumSalaries(subdep);
    }
    return sum;
  }
}