繁体   English   中英

为什么我需要将 Object 传递给 Array.from?

[英]Why Do I need to pass an Object to Array.from?

我不明白为什么以下提供了不同的结果,在第二个中我看到人们使用下划线 (_, i),但我不确定它的作用。

  1. let test1 = Array.from(5, (v,i) => i); //empty array;

  2. let test2 = Array.from({length:5}, (v,i) => i); // [0,1,2,3,4]

我不明白为什么我需要通过 object 来获取由前 n 个数字填充的数组。 有人可以解释一下吗?

您基本上遵循以下方法

Array.from(arrayLike, (currentValue, index) => { ... } )

所以arrayLike变量需要是一个字符串 map... 或者它应该是一个 object 确定数组的长度(就像你的情况一样)。 因此,在您的情况下,数组的大小由arrayLike object 确定。 每次箭头 function 运行并且索引从 0 变为arrayLike.length - 1时, currentvalue都是undefined的。

让我们先看看 Array.from() 方法的签名。

Array.from(arrayLike, mapFn)

因此,第一个参数应该是一个 arrayLike object(一个 object,它的长度属性是非负整数)。 您也可以传递数组、字符串等。

第二个参数是 map function,它将第一个参数 (arrayLike) 的元素映射到回调 function 的返回值。

此 map function 采用带有以下签名的回调 function。

callback(value, index)

map function 创建一个新数组,其中填充了调用回调Array.from (v, i) => i对 Array 的第一个参数中的每个元素的结果。

现在,让我们看第一个案例,

let test1 = Array.from(5, (v,i) => i);

这里, (v, i) => i是 map function。 v是 arrayLike object 的元素, i是该元素的索引。 返回索引i

但是, 5既不是数组也不是 arrayLike object 并且5的长度属性是undefined 因此,map function 不映射(零)元素并生成一个空数组。 考虑以下实现。

function mapFn (arrayLike, callback) {
   let result = [];
   for (let i = 0; i < arrayLike.length; i++) {
       let mappedValue = callback(arrayLike[i], i);
       result.push(mappedValue);
   }
   return result;
}

如果将5传递给 mapFn function,则for循环迭代0次并且mapFn返回一个空数组。

在第二个例子的情况下,

let test2 = Array.from({length:5}, (v,i) => i); // [0,1,2,3,4]

{length: 5}是一个数组,如 object。 map function 生成一个数组,其中包含回调 function 的返回值。 回调 function 返回索引。 因此, [0,1,2,3,4]

在回调 function 中,仅使用i参数并从 function 返回。 不使用v参数。 但是,它需要在那里才能访问第二个参数i 因此, (_, i)(v, i)相同。 您可以使用任何有效的变量名称来命名参数。

因为它期望和 arrayLike object 和 arrays 一样有一个长度属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM