2

可能重复:
Javascript 自定义索引访问器

如果我要在 Javascript 中编写一个双向链表对象,有没有办法像数组一样引用这个新列表?

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

newLinkedList[5]

而不是做我一直在做的事情,就像

newLinkedList.getNode(5)

基本上,有没有办法“美化”对自定义数据结构的引用,还是每次都必须将其作为自定义函数?

4

4 回答 4

3

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

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

var ll_array = {};

ll_array.length = 0;

ll_array.addNode = function (newNode) {
    this[this.length] = newNode;
    this.length++;
};

ll_array.addNode('Foo');
ll_array.addNode('Bar');
console.log('Length: ' + ll_array.length);
console.log(ll_array);
console.log(ll_array[0]);

​</p>

http://jsfiddle.net/rbmsJ/1/

于 2012-10-25T12:59:01.120 回答
0

从你的问题:

  1. 对象保存在双链表中。
  2. 您知道获取第 n 个元素的 getNode(int n) 方法。

没有办法让您获得具有数组样式 [n] 的第 n 个元素。因为链表不是数组,链表中的元素是相互链接的,这种数据结构不同于普通的数组或 JavaScript 风格的数组:命名属性。

于 2012-10-25T13:18:23.070 回答
0

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

假装你有一个 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;
                                              }

显然这必须允许其他假定函数,但想法是遍历链表,并将对每个元素的引用放入数组中,然后返回它。希望在某种程度上有所帮助。

于 2012-10-25T13:02:55.973 回答
-1

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

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

于 2012-10-25T13:25:01.883 回答