Javascript 如何像引用数组一样引用自定义数据结构?

Javascript 如何像引用数组一样引用自定义数据结构?,javascript,Javascript,可能重复: 如果我要用Javascript编写一个双链接列表对象,有没有一种方法可以像数组一样引用这个新列表 例如,如果我想要节点5的值,我想查询 newLinkedList[5] 而不是做我一直在做的事情 newLinkedList.getNode(5) 基本上,有没有一种方法可以“修饰”对自定义数据结构的引用,或者每次都必须将其作为自定义函数执行?Javascript中的数组实际上只是对数值属性进行特殊处理的对象。您可以自己完成同样的事情,但目前Javascript并没有提供一种简单的

可能重复:

如果我要用Javascript编写一个双链接列表对象,有没有一种方法可以像数组一样引用这个新列表

例如,如果我想要节点5的值,我想查询

newLinkedList[5]
而不是做我一直在做的事情

newLinkedList.getNode(5)

基本上,有没有一种方法可以“修饰”对自定义数据结构的引用,或者每次都必须将其作为自定义函数执行?

Javascript中的数组实际上只是对数值属性进行特殊处理的对象。您可以自己完成同样的事情,但目前Javascript并没有提供一种简单的机制来透明地双向访问这些索引;您必须使用命名方法来处理添加和删除对象的操作,但使用类似数组的索引来读取对象仍然会使您受益匪浅

下面是一个简单的自定义“Arrayish”对象的示例:


首先想到的是遍历列表,然后将遍历中的每个项分配给数组元素的蛮力方法:

假设您有一个LinkedList对象。我们还假设有一些方法可以迭代名为Head和Next的列表。现在,需要注意的是,这完全未经测试,您可以通过以下方式创建原型toArray()方法:

LinkedList.prototype.toArray() = function () {   var array={};
                                                 var currentItem = list.head; 
                                                 while (currentItem!=null){
                                                     array.addNode(currentItem);
                                                     currentItem=currentItem.Next;
                                                 }
                                                 return array;
                                              }

显然,这必须考虑其他假定的函数,但其思想是遍历链表,对数组中的每个元素放置一个引用,然后返回它。希望这能有所帮助。

从您的问题:

  • 对象保存在双链接列表中
  • 您知道获取第n个元素的getNode(intn)方法

  • 无法使用数组样式[n]获取第n个元素。由于链表不是数组,链表中的元素彼此链接,因此此数据结构不同于普通数组或JavaScript样式的数组:named属性。

    数组是没有链接的双链表。要向右遍历,只需增加索引;要向左遍历,只需减少索引

    您可以自己编写一组函数来执行基本的列表操作,并且仍然可以使用简单的索引来访问任意aribtrary元素

    LinkedList.prototype.toArray() = function () {   var array={};
                                                     var currentItem = list.head; 
                                                     while (currentItem!=null){
                                                         array.addNode(currentItem);
                                                         currentItem=currentItem.Next;
                                                     }
                                                     return array;
                                                  }