Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 用于添加/追加3+;阵列解释_Javascript_Arrays_Loops - Fatal编程技术网

Javascript 用于添加/追加3+;阵列解释

Javascript 用于添加/追加3+;阵列解释,javascript,arrays,loops,Javascript,Arrays,Loops,几天前我在这里发现了这个。我是一个初学者,所以我发现自己对更复杂的东西是如何工作的非常好奇。我想弄清楚这是怎么回事。有人想添加一些评论或解释一下它是如何工作的吗?我提出的最初问题并没有提供任何解释。我还在学习,所以放松点。谢谢 function sum(a, b) { Object.keys(b).forEach(k => { if (b[k] && typeof b[k] === 'object') return sum(a[k] = a[k] |

几天前我在这里发现了这个。我是一个初学者,所以我发现自己对更复杂的东西是如何工作的非常好奇。我想弄清楚这是怎么回事。有人想添加一些评论或解释一下它是如何工作的吗?我提出的最初问题并没有提供任何解释。我还在学习,所以放松点。谢谢

function sum(a, b) {
    Object.keys(b).forEach(k => {
        if (b[k] && typeof b[k] === 'object') return sum(a[k] = a[k] || {}, b[k]);
        a[k] = (+a[k] || 0) + +b[k];
    });
    return a;
}

var test1 = { testSystem: { crit: "1", high: "0", med: "1", low: "22" }, testSystem1: { crit: "1", high: "0", med: "1", low: "22" }, testSystem2: { crit: "1", high: "0", med: "1", low: "22" }, testSystem3: { crit: "1", high: "0", med: "1", low: "22" } },
    test2 = { testSystem: { crit: "19", high: "305", med: "21", low: "212" }, testSystem1: { crit: "111", high: "10", med: "31", low: "62" }, testSystem2: { crit: "21", high: "3", med: "11", low: "232" }, testSystem4: { crit: "13", high: "40", med: "15", low: "22" }, testSystem7: { crit: "21", high: "3", med: "112", low: "32" } },
    test3 = { testSystem5: { crit: "1", high: "0", med: "122", low: "122" }, testSystem2: { crit: "2", high: "6", med: "1", low: "222" }, testSystem3: { crit: "6", high: "0", med: "12", low: "212" }, testSystem4: { crit: "4", high: "8", med: "11", low: "2" } };

console.log([test1, test2, test3].reduce(sum));

你应该找一些练习来磨练你的逻辑技能和抽象思维。 我将尝试回答您的问题:

1:它寻找一个对象的键里面有什么,如果它是一个对象,这个函数会再次调用它自己(并且会这样做,直到它找到与对象不同的东西)

2:当它确实发现与对象不同的东西时,它会尝试将“thing”转换为数字

a[k] = (+a[k] || 0) + +b[k];
也就是说:如果a[k]存在,将其视为一个数字,或者使用0,然后将b[k]添加到其中,将其视为一个数字

3:testsystemX不是字符串,是每个testX对象的键,每个对象同时包含多个键(从crit到low)

4:函数使用a和b,因为它们是定义函数时使用的参数。这些参数由reduce()函数提供。此外,log函数中没有三个对象,它记录在数组[test1、test2、test3]上调用的.reduce()的结果。
reduce()返回对象、数组或任何您想要的内容。在这种情况下,它是一个由每次迭代时reduce()返回的内容组成的对象。

一些文档可能会帮助您:,,我想我应该说我理解所有这些内容在基本层面上的作用,但类似的事情是:b[k]如何表示所有值?为什么在尝试将[k]添加到b[k]时不会抛出错误?这不会尝试为testsystemX添加字符串吗?函数正在使用a、b,但在console.log中它正在传入3个对象?可以添加任意数量的吗?
[]。reduce
使用数组中最后一个调用和下一个项的结果调用传递的函数,因此它调用
sum(test1,test2)
,然后获取该结果(我们称之为
res
),并调用
sum(res,test3)
,以此类推,直到没有剩余的数组项可调用
sum
on,此时返回最终结果。这里有一些伪代码可以帮助您理解
sum
,顺便说一句,它是一个递归函数(这就是如何添加a[k]和b[k]):使用对象
b
中的每个键调用以下代码,该键具有变量
k
:如果对象
b
中的键
k
是且是一个对象(例如,将键映射到值,而不是整数或字符串),(这是非常简洁的语法,很难阅读/解释,但我会尽我所能)返回调用
sum
(此函数)的结果,参数为对象
a
中的键
k
(如果它存在)或
{/code>(如果它不存在)(还分配
{}
to
a[k]
if not)和对象
b
中的键
k
。如果未执行上述代码(函数调用自身并返回),则对象
a
中的键
k
如果存在,则设置为自身(无效)或者
0
如果没有,则返回对象
b
a
中的键
k
。(我强烈建议查看@Jorge Solis的答案,它提供了对代码关键组件的更一般的解释。)