2016-03-03 35 views
-2

在我看來,JavaScript的一大缺點是沒有關聯數組。對象不提供順序,數組不提供密鑰。Javascript:通過改變Array.prototype關聯數組 - 已棄用?

還有陣列的可能性包含對象:

[{key1:value1}, {key2:value2}] 

但據我所知,有訪問由密鑰元素在這個方法(而不必通過所有元素進行迭代)沒有簡單的方法。

這就是爲什麼我開始思考下面的辦法,即通過添加元素映射形成陣列關聯:

Array.prototype.addKeyToLastElement = function(key) { 
    if (!this.elementMapper) this.elementMapper = {}; 
    this.elementMapper[key] = this.length-1; 
} 
Array.prototype.getElementByKey = function(key) { 
    if (this.elementMapper && this.elementMapper[key] !== undefined) { 
     return this[this.elementMapper[key]]; 
    } 
    else { 
     return undefined; 
    } 
} 

var test = []; 
test.push(1); 
test.addKeyToLastElement('a'); 
test.push(3); 
test.addKeyToLastElement('b'); 

// get element by key 
console.log(test.getElementByKey("a")); 

我知道,這是遠遠不夠完善,這只是第一次嘗試,看看如果它有效。我只是想知道爲什麼我找不到任何類似的解決方案。

此方法是否被棄用?如果是,那麼最好的選擇是什麼?

我的最低要求是:

  1. 訪問的鍵(檢索/改變值)
  2. 保持的元素都是由key和value訂購
  3. 排序元素來
+0

看一看ES6地圖:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map。改變原生原型被認爲是不好的做法。 – nils

+0

有解決這些問題的庫,沒有必要重新開發車輪,尤其是在使用原型時 – Gntem

+0

@ am2124429您的意思是_「陣列不提供密鑰」_?你想使用字母訪問數組的元素嗎?例如'arr [a]'? – guest271314

回答

1

陣列不提供鑰匙

但作爲排序是這樣的對象(你的問題)

[{key1:value1}, {key2:value2}] 

據我所知,在這個應用程序中使用鍵 訪問元素並不容易蟑螂(而不必通過所有元件進行迭代)

如果正確地解釋問題,你可以指定一個字母或其它「鑰匙」作爲索引標識符,並使用數字標識符到該陣列中訪問相同的元件

var alphabet = "abcdefghijklmnopqrstuvwxyz"; 
 

 
var arr = []; 
 

 
for (var i = 0; i < alphabet.length; i++) { 
 
    arr[alphabet[i]] = arr[i] = alphabet[i] 
 
}; 
 

 
console.log(arr["a"], arr[0], arr["z"], arr[25])

+0

我不知道這很容易:'arr [「myKeyToArr0」] = arr [0];'。這正是我一直在尋找的。任何人都可以告訴我這是如何調用的,或者我可以在這裏找到進一步的閱讀內容? – am2124429

+0

請參閱http://stackoverflow.com/questions/21293063/how-to-programmatically-enumerate-an-enum-type-in​​-typescript-0-9-5 – guest271314

+0

該線程似乎既不是關於JavaScript或數組。或者我錯過了什麼? – am2124429

1

這種方法是否被棄用?如果是,那麼最好的選擇是什麼?

它不會被棄用,但它不是一個好主意,因此對於主要有以下原因

  • 這些額外的屬性不包括在JSON序列化不好的編碼實踐。
  • 如果您執行像arr = arr.slice(1)這樣的數組操作會導致不可預期的行爲,這些屬性將被丟棄。

但你仍然可以通過做

var arr = [{key1:value1}, {key2:value2}]; 
arr.sort(function(a,b){ 

    return a[Object.keys(a)[0]] - b[Object.keys(b)[0]]; 

})