2017-07-11 82 views
2

当我做为什么Array.from()返回第一个元素undefined?

const arrayLike = { 1:'foo', 2:'bar', length:2 }; 
Array.from(arrayLike); 

我得到

[ undefined, 'foo' ] 

当我做

const arrayLike = { 1:'foo', 2:'bar', length:3 }; 
Array.from(arrayLike) 

我得到

[ undefined, 'foo', 'bar' ] 
  • 为什么我在设置长度时看不到bar
  • 为什么我只看到我的元素时,只有当我把硬度设置为3?
  • 为什么第一个元素显示为undefined
+0

的可能重复:我如何在JavaScript中创建一个数组,其索引开始从1](https://stackoverflow.com/q/2826682/6188402) –

+0

@WashingtonGuedes与array.from无关。该问题只是想要实现1索引数组,而不是将1索引对象转换为数组。 –

+0

依然相关。解释这篇文章的问题。 –

回答

7

Array的是0在JavaScript

所有这些问题索引是相当简单的回答。 Array.from假设你给它的类似数组的对象是零索引的。如果不是的话,你会得到一个没有设置所有元素的索引为零的数组,包括设置为undefined0。所以,在你的榜样,

const arrayLike = { 1:'foo', 2:'bar', length:2 }; 
Array.from(arrayLike); 

在本质上是一样的,

const arrayLike = { 0:undefined, 1:'foo', 2:'bar', length:2 }; 
Array.from(arrayLike); 

由于长度小于最大元素,它实质上停止在该点迭代和假长充当截断。你需要的是有可能的,

const arrayLike = { 0:'foo', 1:'bar', length:2 }; 
Array.from(arrayLike); 

或者,如果你得到了Array类从1索引源,适当设置length以免失去最后一个元素,然后沟的第一个元素从结果(相当于shift)。

const arrayLike = { 1:'foo', 2:'bar', length:3 }; 

let arr = Array.from(arrayLike).splice(1); 

let arr = Array.from(arrayLike); 
arr.shift(); 


let [, ...arr] = Array.from(arrayLike); 
+0

您可以使用回调:Array.from(arrayLike,(v,i)=> {console.log(v,i);});'显示'Array.from'转换对象的方式。 –

1

Array.from(obj)不返回undefined,它返回一个新数组使用属性从一个给定的阵列状物体obj

而且创建的每个索引位置的默认值没有给出时是不确定的。

您看到的undefined值在创建的数组的索引0处。

总而言之,这不是问题,您仍然可以访问索引12,它们将返回您希望它们返回的值。

您也可以验证创建的阵列与所述默认行为:

console.log(new Array(10))

哪些日志(索引位置0..9)(长度10):

[undefined x 10] 

在JavaScript ,您将看不到以外的第一个索引。独立如何创建数组。


另一种选择你正在做的事情是设置原型

const arrayLike = { 1:'foo', 7:'bar' }; 
 

 
//Dynamic set the length 
 
arrayLike.length = Math.max(...Object.keys(arrayLike)) + 1; 
 

 
//Get built-in features of Array to your arrayLike 
 
Object.setPrototypeOf(arrayLike, Array.prototype); 
 

 
//Do something 
 
arrayLike.forEach((x, i) => console.log("%i: %s", i, x))

相关问题