2017-04-06 49 views
-2

好像mapforEachfilter和這種運營商與字符串索引的數組,像這樣不工作:JavaScript數組操作

let a = []; 
a['first element'] = 1; 
a['second element'] = 2; 
a['third element'] = 3; 
a.forEach(console.log) 
//undefined 
+0

邊注:在大多數環境中,你很可能會被一點點你'someArray.forEach(執行console.log)看看有什麼驚訝;'某些環境可能會引發錯誤(因爲使用'this'調用'log'並不是指''console')。其他人可能會工作,但向你展示你不期望的東西,例如每個循環迭代的三件事情,而不是一件。這是因爲大多數'console.log'實現會記錄它們接收到的所有**參數,而'forEach'使用三個參數調用它的回調函數:入口,其索引和數組引用。 :-) –

回答

2

這是因爲它不是一個「串索引陣列「。 JavaScript沒有這些。你在那裏有一個數組(因爲你使用了[]),但是你並沒有將它作爲一個數組使用,所以你將它用作一個對象。 (數組也是對象;請參閱我的A myth of arrays。)這些是對象屬性名稱。如果您沒有使用它的數組性質,請使用{}而不是[]來創建它。

有幾個操作進行迭代屬性名稱:

  • 您可以通過Object.keys得到一個對象自己的,枚舉的屬性名稱的數組。還有Object.getOwnPropertyNames
  • 您可以使用for-in循環遍歷所有可枚舉的屬性(包括繼承的屬性)。
  • 普通對象不可迭代,所以我們不能使用for-of,但是如果你想要類似「字符串索引數組」的東西,你可以看看Map,這是可迭代的。

這裏有幾個例子:

let a = {}; 
 
a['first element'] = 1; 
 
a['second element'] = 2; 
 
a['third element'] = 3; 
 
console.log("for-in:"); 
 
for (let key in a) { 
 
    console.log(key); 
 
} 
 
console.log("Object.keys:"); 
 
Object.keys(a).forEach(key => console.log(key));

0

這是因爲當你訪問一個這樣的數組:

a['first element'] 

你不能訪問數組元件。你將一個屬性放入數組對象中。

您可以通過兩種方式訪問​​JavaScript對象中的屬性:obj.property或obj ['property']。一個數組是一個像其他任何對象一樣的對象,它有一些方法可以將元素放入數組中(.push),但由於它是一個對象,除了元素之外,它還可能具有其他屬性。它已經有一些(如.length)。所以你只是包括更多。

對於你的pupose(地圖)而不是使用數組對象,你可以使用一個空對象。就像這樣:

let a = {}; 
 
a['first element'] = 1; 
 
a['second element'] = 2; 
 
a['third element'] = 3; 
 
// then you use for...in instead of forEach: 
 
for(element in a) { 
 
    // and get the value of the property in the element like this: 
 
    console.log(a[element]); 
 
}

另外還有新的地圖和WeakMap對象。你想看看他們在這裏的鏈接:https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Map

下面是使用地圖的例子:

所有的

var a = new Map(); 
 
a.set('first element', 1); 
 
a.set('second element', 2); 
 
a.set('third element', 3); 
 
for (var [key, value] of a) { 
 
    console.log(key + ": " + value); 
 
} 
 
// Now you can also use forEach 
 
a.forEach((value, key)=>console.log(key + ": " + value));

1

首先,你正在一個對象。

a['first element'] = 1; 
    ^^^^^ -> key ^-> it's value 

如果你想分配指定的元素到數組,請參閱a陣列,它的指定index - 例如[0]並分配一些值,例如1

而關於Array#forEach函數 - 如果你想記錄每個元素,你必須傳遞一個參數來保存數組中的每個元素。

let a = []; 
 
a[0] = 1; 
 
a[1] = 2; 
 
a[2] = 3; 
 
a.forEach(v => console.log(v))