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>(如果它不存在)(还分配{}
toa[k]
if not)和对象b
中的键k
。如果未执行上述代码(函数调用自身并返回),则对象a
中的键k
如果存在,则设置为自身(无效)或者0
如果没有,则返回对象b
a
中的键k
。(我强烈建议查看@Jorge Solis的答案,它提供了对代码关键组件的更一般的解释。)