任何人都可以向我解释这段代码的工作原理吗?我在Array中查找了reduce
和concat
函数,我了解这些函数,但我不明白这段代码是如何工作的:
var arrays = [[1, 2, 3], [4, 5], [6]];
console.log(arrays.reduce(function(flat, current) {
return flat.concat(current);
}, []));
// → [1, 2, 3, 4, 5, 6]

答案 0 :(得分:0)
您可以在我们传递给console.log
的回调中添加reduce
并考虑输出:
var arrays = [[1, 2, 3], [4, 5], [6]];
console.log(arrays.reduce(function(flat, current) {
console.log('flat: '+ flat + 'current: ' + current)
return flat.concat(current);
}, []));

最初我们连接一个空数组和数组[1,2,3]。所以结果是一个带元素[1,2,3]的新数组。然后我们将这个数组与arrays
的下一个元素,数组[4,5]连接起来。所以结果将是一个带有元素[1,2,3,4,5]的新数组。最后,我们将此数组与arrays
的最后一个元素array
[6]连接起来。因此结果是数组[1,2,3,4,5,6]。
为了详细了解上述内容,您必须阅读Array.prototype.reduce()。
如上所述:
reduce()方法对累加器和每个都应用一个函数 数组的值(从左到右)将其减少为单个值
此外语法是
arr.reduce(callback, [initialValue])
在这种情况下,initialValue是一个空数组[]
。
答案 1 :(得分:0)
我已经为您描述了每一步。
var arrays = [[1, 2, 3], [4, 5], [6]];
console.log(arrays.reduce(function(flat, current) {
// first loop: flat - [1,2,3], current - [4,5]
// [1,2,3].concat([4,5]) -> [1,2,3,4,5]
//second/last loop: flat - [1,2,3,4,5], current - [6]
// [1,2,3,4,5].concat([6]) -> [1,2,3,4,5,6]
//function stop
return flat.concat(current);
}, []));

答案 2 :(得分:0)
实际上这是对.reduce()
的错误使用。对于这项工作,您不需要任何初始数组。只需前一个(p
)和当前(c
)可以做到这一点。如;
var arrays = [[1, 2, 3], [4, 5], [6]];
console.log(arrays.reduce((p,c) => p.concat(c)));
注意:当返回值的类型与数组项不同时,Initial很方便。但是在这种情况下,您正在处理数组并返回一个使用初始冗余的数组。
答案 3 :(得分:0)
假设我们有你做的2D数组:array.reduce((accumulator, iterator) => {...}, initialValue);
正在被缩减,该函数被分成两个主要组件。
flat
reduce
- 这是减少的累加器。它被赋予初始值,传递给current
函数的第二个参数,并用于在迭代器通过它们时存储值。;WITH CTE AS
(
SELECT
CAST(SUM(Hours_Current) AS FLOAT)/60 AS Current_Hours
CONVERT(FLOAT, CONVERT(VARCHAR(MAX), ObjField)) AS [Time]
FROM ...
WHERE ...
)
SELECT Current_Hours As [Current Hours],
[Time],
[Time] - Current_Hours As [Diff]
FROM CTE
- 这是遍历数据集中所有值的迭代器。因此,当您迭代数据集时,您的示例是将累积数组与当前值连接,最后您将获得新数组。
答案 4 :(得分:0)
Array.reduce
期望带有以下签名的回调:
function(previousElement,currentElement,index,array)
和可选的初始值。
在第一次迭代中,如果传递initialValue
,则previousElement
将保留此值,currentElement
将保存`firstArrayElement。
如果没有,则previousElement
将保留firstArrayElement
,currentElement
将保留secondArrayElement
。
对于以下迭代,previousElement
将保留上一次迭代返回的值,currentElement
将保留下一个值。
因此,在您的示例中,最初flat
拥有[]
。
return flat.concat(current);
将返回一个新的合并数组。对于下一次迭代,此值将用作flat
,并返回此过程。最后,上次迭代返回的值用作最终返回值,并在控制台中打印。