Javascript数组高阶函数

时间:2017-03-06 16:13:13

标签: javascript arrays higher-order-functions

任何人都可以向我解释这段代码的工作原理吗?我在Array中查找了reduceconcat函数,我了解这些函数,但我不明白这段代码是如何工作的:



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]




5 个答案:

答案 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将保留firstArrayElementcurrentElement将保留secondArrayElement

对于以下迭代,previousElement将保留上一次迭代返回的值,currentElement将保留下一个值。

因此,在您的示例中,最初flat拥有[]

return flat.concat(current);将返回一个新的合并数组。对于下一次迭代,此值将用作flat,并返回此过程。最后,上次迭代返回的值用作最终返回值,并在控制台中打印。