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