2017-07-11 149 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))

相關問題