我需要一个列表类型对象同时提供可迭代和关联的相反 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
属性(添加推送,修改它时修改数组本身等)
'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 中原生支持的Map
或Set
函数。这是一个很好的做法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句