如何编写 JavaScript Array.from() 映射函数?
How to write a JavaScript Array.from() Map Function?
我正在使用普通 JS 和 HTML/CSS 在浏览器中构建俄罗斯方块游戏。我遵循的教程将网格视为二维矩阵,并使用以下代码片段将其初始化为全零开始:
return Array.from(
{length : ROWS}, () => Array(COLS).fill(0)
);
我希望得到有关此代码片段如何实际实现此目的的解释。我理解第二个参数是一个箭头函数,它用 0 填充数组,但我不太理解第一部分。此代码本质上是否与 for 循环执行相同的工作,如果是,是否可以替换它?
抱歉,如果这个问题不合适,我找不到完全相同的副本,并且由于我缺乏理解,我不确定如何 google 这个问题。
我认为您的代码段缺少某些部分
Array.from()
是一个函数,可以从可迭代对象创建数组,然后可以通过数组进行映射。
我想它应该看起来像这样
Array.from({length : ROWS}).map((item) => {item.fill(0)))
您可以在此处的 mozzilla 文档上阅读有关 Array.from() 的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
和 Array.map() 此处:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/map
Array.from
是一种静态方法,它允许您从类数组或可迭代对象创建一个新的浅拷贝 Array
实例。
在你的例子中,第一个参数只是一个对象本身。 Array.from
实际上在做的是在第一个参数上寻找 .length
属性(如果它是一个数组,这很明显,但否则任何可迭代对象都有 .length
属性.
那个例子有点作弊,你不是传递一个实际有意义的可迭代对象,而是传递一个空对象,但将 .length
属性 指定为行数。
由于该对象有一个 .length
属性(即使字面意思就是它包含的所有内容),Array.from
方法知道如何处理它。
如果您想要等效的东西,您可以使用 for 循环,就像您描述的那样:
var newArray = [[]]
for (var i = 0; i < ROWS; i++) {
for (var j = 0; j < COLS; j++) {
newArray[i][j] = 0
}
}
他们的方法更 shorthand 更干净。
Array from 可以接收 3 个参数并为您创建一个新的数组实例。
arrayLike: ArrayLike<T>
mapfn: (v: T, k: number) => U
thisArg?: any
arrayLike
arrayLike 有一个可以接收两个不同参数的构造函数:
- 只读长度:数字;
- 只读[n: 数字]: T;
可以输入两个不同类型的 from
作为第一个参数:
console.log('{length: number}: ', Array.from({ length: 2 }));
console.log('[..., ...]: ', Array.from([1, 2]));
mapfn
这是一个内置的地图功能。您可以使用它来更改第一个参数的值:
const multiplyByTwo = (entry) => entry * 2
console.log('without: ', Array.from([1,2]))
console.log('with multiply: ', Array.from([1,2], multiplyByTwo))
console.log('with multiply anonymus: ', Array.from([1,2], (entry) => entry * 2))
thisArg
您可以将上下文绑定到作为第二个参数传递的函数。它类似于 fn.bind(context)
:
function override (entry) {
return this.num;
}
class Foo {
num = 3;
constructor() {
console.log('arrayWithThis: ', Array.from([1, 2], override, this))
console.log('arrayWithoutThis: ', Array.from([1, 2], override))
}
}
const foo = new Foo();
我正在使用普通 JS 和 HTML/CSS 在浏览器中构建俄罗斯方块游戏。我遵循的教程将网格视为二维矩阵,并使用以下代码片段将其初始化为全零开始:
return Array.from(
{length : ROWS}, () => Array(COLS).fill(0)
);
我希望得到有关此代码片段如何实际实现此目的的解释。我理解第二个参数是一个箭头函数,它用 0 填充数组,但我不太理解第一部分。此代码本质上是否与 for 循环执行相同的工作,如果是,是否可以替换它?
抱歉,如果这个问题不合适,我找不到完全相同的副本,并且由于我缺乏理解,我不确定如何 google 这个问题。
我认为您的代码段缺少某些部分
Array.from()
是一个函数,可以从可迭代对象创建数组,然后可以通过数组进行映射。
我想它应该看起来像这样
Array.from({length : ROWS}).map((item) => {item.fill(0)))
您可以在此处的 mozzilla 文档上阅读有关 Array.from() 的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
和 Array.map() 此处:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/map
Array.from
是一种静态方法,它允许您从类数组或可迭代对象创建一个新的浅拷贝 Array
实例。
在你的例子中,第一个参数只是一个对象本身。 Array.from
实际上在做的是在第一个参数上寻找 .length
属性(如果它是一个数组,这很明显,但否则任何可迭代对象都有 .length
属性.
那个例子有点作弊,你不是传递一个实际有意义的可迭代对象,而是传递一个空对象,但将 .length
属性 指定为行数。
由于该对象有一个 .length
属性(即使字面意思就是它包含的所有内容),Array.from
方法知道如何处理它。
如果您想要等效的东西,您可以使用 for 循环,就像您描述的那样:
var newArray = [[]]
for (var i = 0; i < ROWS; i++) {
for (var j = 0; j < COLS; j++) {
newArray[i][j] = 0
}
}
他们的方法更 shorthand 更干净。
Array from 可以接收 3 个参数并为您创建一个新的数组实例。
arrayLike: ArrayLike<T>
mapfn: (v: T, k: number) => U
thisArg?: any
arrayLike
arrayLike 有一个可以接收两个不同参数的构造函数:
- 只读长度:数字;
- 只读[n: 数字]: T;
可以输入两个不同类型的 from
作为第一个参数:
console.log('{length: number}: ', Array.from({ length: 2 }));
console.log('[..., ...]: ', Array.from([1, 2]));
mapfn
这是一个内置的地图功能。您可以使用它来更改第一个参数的值:
const multiplyByTwo = (entry) => entry * 2
console.log('without: ', Array.from([1,2]))
console.log('with multiply: ', Array.from([1,2], multiplyByTwo))
console.log('with multiply anonymus: ', Array.from([1,2], (entry) => entry * 2))
thisArg
您可以将上下文绑定到作为第二个参数传递的函数。它类似于 fn.bind(context)
:
function override (entry) {
return this.num;
}
class Foo {
num = 3;
constructor() {
console.log('arrayWithThis: ', Array.from([1, 2], override, this))
console.log('arrayWithoutThis: ', Array.from([1, 2], override))
}
}
const foo = new Foo();