这个 concat 命令如何与这个数组一起工作?

how does this concat command work with this array?

我遇到了这个 JS 问题,但我无法弄清楚它是如何工作的语法,有人可以帮忙解释一下吗?我不明白开头的空方括号语法以及如何将 concat 与另一个空方括号一起应用?这让我很困惑。

感谢任何帮助来解决这个问题。

let arr = [[1, 2],[3, 4],[5, 6, 7, 8, 9],[10, 11, 12]];

let flattened = [].concat.apply([], arr);
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]

[] 是一个空数组。 concat 函数连接两个或多个数组:[].concat(arr[0], arr[1], arr[2], arr[3])

这里的要点是了解 apply 的工作原理。 apply 的第二个参数是一个参数数组。就像这样做(如果您熟悉解构的概念): [].concat(...arr)

您可以阅读更多关于申请的信息here

所以让我们一步步来吧。
[].concat() 只是函数,因为 apply 不是调用常规元素,而是函数。使用前面的 [] 只是为了让您可以调用 concat,因为它是数组的一种方法。 apply() 方法调用具有给定 this 值的函数,并以数组形式提供参数。
所以 [].concat.apply([], arr) 有 3 个部分:

  • concat - 使用的函数
  • [] - 调用函数的元素(第一个参数 提供的申请)
  • arr - 传递给所用函数的元素数组 时间

所以在引擎盖下它看起来像这样:

[].concat([1, 2]).
  .concat([3, 4])
  .concat([5, 6]) //etc

然后返回连接的数组并存储到flattened中。现在 arr 的每个子数组都已相互连接并生成一个简单的数组 [1, 2, 3, 4, 5, 6, ...]

let arr = [[1, 2],[3, 4],[5, 6, 7, 8, 9],[10, 11, 12]];

let flattened = [].concat.apply([], arr);
*first array*---|                |---*second array*
           

first数组有一个目标:

  • this 调用 concat() 方法。这里 thissecond 数组。然后first数组被扔掉

然后 apply() 方法将 arr 数组展平到一级。 您可以查看:

let foo = [0].concat([1,2,3], [[1,2,3]] ); 
console.log(foo)

更新:

另外,可以去掉第一个数组:

const arr = [[1, 2],[3, 4],[5, 6, 7, 8, 9],[10, 11, 12]];

const flattened = Array.prototype.concat.apply([], arr);
console.log(flattened)

有关 apply() 工作原理的一些信息。

此外,了解 apply() 如何将数组项展平到一个级别或 apply() 如何采用参数数组并将该数组的每个元素视为单个参数将非常有用.

让我举一个简单的例子。我们有以下对象和方法:

const showFullName = (arg_1, arg_2) => {
    console.log(`arg_1 is ${arg_1}`);
    console.log(`arg_2 is ${arg_2}`);
}

let foo = {};
showFullName.apply(foo, ['firstName', 'surname']);