可能重复:
Javascript 自定义索引访问器
如果我要在 Javascript 中编写一个双向链表对象,有没有办法像数组一样引用这个新列表?
例如,如果我想要节点 5 的值,我想查询
newLinkedList[5]
而不是做我一直在做的事情,就像
newLinkedList.getNode(5)
基本上,有没有办法“美化”对自定义数据结构的引用,还是每次都必须将其作为自定义函数?
可能重复:
Javascript 自定义索引访问器
如果我要在 Javascript 中编写一个双向链表对象,有没有办法像数组一样引用这个新列表?
例如,如果我想要节点 5 的值,我想查询
newLinkedList[5]
而不是做我一直在做的事情,就像
newLinkedList.getNode(5)
基本上,有没有办法“美化”对自定义数据结构的引用,还是每次都必须将其作为自定义函数?
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>
从你的问题:
没有办法让您获得具有数组样式 [n] 的第 n 个元素。因为链表不是数组,链表中的元素是相互链接的,这种数据结构不同于普通的数组或 JavaScript 风格的数组:命名属性。
遍历列表的蛮力方法,然后将遍历中的每个项目分配给数组元素,这是首先想到的:
假装你有一个 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;
}
显然这必须允许其他假定函数,但想法是遍历链表,并将对每个元素的引用放入数组中,然后返回它。希望在某种程度上有所帮助。
数组是没有链接的双链表。向右遍历只需增加索引,向左遍历则减少索引。
您可以自己编写一组函数来执行基本的列表操作,并且仍然可以使用简单的索引来访问任何任意元素。