我需要一个列表类型对象,同时提供可迭代和关联的相反JS数组行为。所以有一点我想运行一个基于索引的成员遍历,另一个我想要做'这个密钥存在'和'更新该密钥下的数据'。
我在SO中看到很多关于关联数组讨论的问题,但这个问题不同,因为我正在寻找包含两种行为的可重用代码。解决方案可以是数组原型的修饰符,也可以是独立的对象创建函数。我接受列表必须是唯一的键,而在我的情况下,FYI成员将是对象本身。
请注意我知道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);
答案 0 :(得分:2)
我知道这远远没有完成,但它可能会给你一个起点,扩展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);
}
&#13;
基本上,您正在重新实现Map
或Set
函数,这些函数在es6中本机支持。这是一个非常好的做法。