我在网上做了一些javascript练习(codewars.com)。一个问题是要求用户获取一组数组对象并从整个数组中删除一个级别。
[] /* becomes */ []
[[1, 2, 3], ["a", "b", "c"], [1, 2, 3]] /* becomes */ [1, 2, 3, "a", "b", "c", 1, 2, 3]
[[3, 4, 5], [[9, 9, 9]], ["a,b,c"]] /* becomes */ [3, 4, 5, [9, 9, 9], "a,b,c"]
我最后了解了concat方法,但最流行的解决方案使用了这个声明......
function (arr){
return [].concat.apply([],arr);
}
有人可以在这里解释[]
的用法吗?我无法理解这是如何产生正确的结果的(并且它没有在页面上给出解释)。我知道还有很多其他时候使用空括号作为参数和标签数组,因此理解这里的用法可能有助于我将来自己使用它。
答案 0 :(得分:8)
让我们将它分成多行,这样更容易描述。行D
的描述具体是回答您的问题的原因
[] // A
.concat // B
.apply( // C
[], // D
arr // E
);
A
是数组,但在这里它只是用作Array.prototype
的快捷方式,因此我们可以访问.. B
来自Array.prototype
concat
方法
C
然后我们使用apply
)
D
this
新数组的参数,作为基础对象和E
一个参数列表,这是我们之前的arr
因此,您可以使用Array.prototype
和call
重写
var new_base_arr = [];
Array.prototype.concat.call(
new_base_arr,
arr[0],
arr[1],
...
arr[n]
);
你可能看起来更熟悉
new_base_arr.concat(arr[0], arr[1], ..., arr[n]);
这里要解决的问题是调用具有未确定数量的参数的函数。