我正在尝试制作类似于数组的东西。
我需要能够“释放”一个索引(将其值设置为undefined)但我不想丢失索引。 每当将新项目放入阵列时,都应重新使用“已发布”索引。
我希望能够做到这样的事情:
example = new MyArray();
a = example.leaseIndex(); // returns 0
example[a] = "example value";
b = example.leaseIndex(); // returns 1
example[b] = "another value";
example.releaseIndex(0);
c = example.leaseIndex(); // returns 0
example[c] = "yet another value";
在我的示例中,leaseIndex查找可用索引,或者如果没有可用索引,则将新项目推送到数组并返回该项目的索引。
我想这样做,以便阵列不会随着时间的推移不断变大。 我无法删除“已发布”的项目,因为数组中的每个项目都包含对同一数组中另一个项目的引用。
我在主要数据之外的函数和数组方面取得了一些小的成功,以跟踪可用的索引并分配和释放它们,但理想情况下我希望功能成为主数组的一部分。
我是否必须将我的函数添加到Array(或其原型)中,还是有另一种方法?因为并非我的所有阵列都需要此功能。
希望这是有道理的:/
更新
我正在尝试存储布线织机布局,这些布局基本上是一个网络图(关于点如何连接的点和信息)。
图为一个示例织机。它有3个连接器;红色(0)有2行,黄色(1)有3行,绿色(2)有2行。 红色连接器上的一条线是拼接(允许多条线连接到单线,蓝色方块)
这就是织机存放的方式。
loom = {
points = [
{ self: 0, list: [ 2 ] },
{ self: 1, list: [ 7 ] },
{ self: 2, list: [ 0 ] },
{ self: 3, list: [ 7 ] },
{ self: 4, list: [ 6 ] },
{ self: 5, list: [ 7 ] },
{ self: 6, list: [ 4 ] },
{ self: 7, owner: 1, list: [ 1, 3, 5 ] }
],
connectors = [
[ 0, 1 ],
[ 2, 3, 4 ],
[ 5, 6 ]
]
}
connector数组中的元素包含points数组中的点索引。 每个points对象中的list数组包含其目标的索引,这些索引也是点。
我试图创建函数来帮助管理索引更容易,只是想知道是否有一种方法来扩展数组,或者做一些类似的功能。使用静态函数就可以了,这就是我一直在使用的。我只是想看看我是否可以扩展数组,或者使用类似的东西,所以我不需要使用静态函数。
答案 0 :(得分:0)
这是一个使用一些静态函数的简单实现(无需对方法大惊小怪):
var hop = function(obj, prop){
return Object.prototype.hasOwnProperty.call(obj, prop);
};
var leaseIndex = function(arr, value){
var i;
for(i=0; i<arr.length; i++){
if(!hop(arr, i)){
break;
}
}
arr[i] = value;
return i;
};
var releaseIndex = function(arr, i){
delete arr[i];
};
当然,我不知道这是否是你真正想要的,因为我的算法可能是O(N),我不确定你是否需要所有这些复杂功能。
答案 1 :(得分:0)
我会将这些方法添加到Array的原型中,如下所示:
Array.prototype.leaseIndex = function () {
for (var i = 0; i < this.length; i++) {
if(typeof this[i] === "undefined") {
return i;
}
}
return this.length;
};
Array.prototype.releaseIndex = function (index) {
delete this[index];
};
所以,你的代码看起来像这样:
example = [];
a = example.leaseIndex(); // returns 0
example[a] = "example value";
b = example.leaseIndex(); // returns 1
example[b] = "another value";
example.releaseIndex(0);
c = example.leaseIndex(); // returns 0
example[c] = "yet another value";
我希望它有所帮助。