可迭代的关联数组对象

时间:2017-06-08 08:01:44

标签: javascript arrays

我需要一个列表类型对象,同时提供可迭代和关联的相反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);

1 个答案:

答案 0 :(得分:2)

我知道这远远没有完成,但它可能会给你一个起点,扩展Array类会给你数组的特殊length属性(在推送时添加,当它修改了它修改了数组本身等)

&#13;
&#13;
'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;
&#13;
&#13;

基本上,您正在重新实现MapSet函数,这些函数在es6中本机支持。这是一个非常好的做法。