簡體   English   中英

迭代關聯數組對象

[英]Iterable associative array object

我需要一個列表類型的對象,同時提供可迭代和關聯的相反JS數組行為。 因此,一方面我想對成員進行基於索引的遍歷,另一方面,我想做到“此鍵是否存在”並“更新該鍵下的數據”。

我在SO中看到很多有關關聯數組的討論的問題,但是這個問題有所不同,因為我正在尋找包裝兩種行為的可重用代碼。 解決方案可以是數組原型的修改器,也可以是獨立的對象創建函數。 我接受該列表必須通過鍵唯一,並且就我而言,僅供參考,成員本身就是對象。

請注意,我知道JavaScript中沒有諸如關聯數組之類的東西-我不需要那個講道。 我尋求針對具有相同功能的單個對象的解決方案。

這是工作片段中的基本版本。 我正在尋找一個更加充實的版本,其中包括諸如處置等完整的生命周期功能。

 var List = function() { this.elements={} // assoc list of elements. this.elementArray=[] // plain array this.addElement=function (id, member) { this.elements[id]=member; this.elementArray.push(member); } } var myList = new List(); myList.addElement('V', {id: 'key2', name: 'Volvo'}); myList.addElement('A', {id: 'key4', name: 'Apple'}); myList.addElement('S', {id: 'key3', name: 'Google'}); console.log('Via iteration'); for (var i = 0; i < myList.elementArray.length; i = i + 1) { console.log('id=' + myList.elementArray[i].id + ' name=' + myList.elementArray[i].name); } console.log('Via association'); console.log('Value of A: id=' + myList.elements['A'].id + ' name=' + myList.elements['A'].name); console.log('Value of V: id=' + myList.elements['V'].id + ' name=' + myList.elements['V'].name); console.log('Value of S: id=' + myList.elements['S'].id + ' name=' + myList.elements['S'].name); 

我知道這還遠未完成,但是它可能會為您提供一個起點,擴展Array類會為您提供數組的特殊length屬性(添加在push上,修改后會修改數組本身,等等)

 'use strict'; class AssociativeArray extends Array { constructor() { super(); this.data = {}; } push(key, value) { super.push(key); this.data[key] = value } *[Symbol.iterator]() { let nextIndex = 0; while(nextIndex < this.length) { yield this[nextIndex]; nextIndex++; } } } var myAssociativeArray = new AssociativeArray(); myAssociativeArray.push("1st", "Bamieh"); myAssociativeArray.push("2nd", "value"); myAssociativeArray.push("3nd", "anotherValue"); console.log('myAssociativeArray::', myAssociativeArray); console.log('myAssociativeArray.length::', myAssociativeArray.length); for (let key of myAssociativeArray) { console.log('key::', key); } 

基本上,您是在重新實現es6本機支持的MapSet函數。 不過,這是一種好的做法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM