可迭代关联数组对象

被征服的袋熊

我需要一个列表类型对象同时提供可迭代和关联的相反 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 中原生支持MapSet函数。这是一个很好的做法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章