2012-05-15 83 views
2

我試圖做一些類似於數組的東西。創建一個類似於數組的對象或者擴展數組原型

我需要能夠「釋放」索引(將其值設置爲未定義),但我不想丟失索引。 無論何時將新項目放入數組中,都應該重新使用「已發佈」索引。

我希望能夠做這樣的事情:

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找到可用的索引,如果沒有可用的推新的項目到陣列,並返回該項目的索引。

我想這樣做,以便數組不會隨着時間的推移不必要地變大。 我無法刪除「已發佈」項目,因爲數組中的每個項目都包含對同一陣列中另一項目的引用。

我已經在函數和數組之外做了小小的成功,以跟蹤可用的索引並分配和釋放它們,但理想情況下我希望函數成爲主數組的一部分。

我需要將我的函數添加到數組(或其原型)還是有另一種方式?因爲並非所有的數組都需要這個功能。

希望這是有道理的:/

更新

我試圖存儲佈線織機的佈局,這基本上是一個網絡圖(點和信息的點是如何連接)。

圖爲織機示例。它有3個連接器; 2行紅色(0),3行黃色(1)和2行綠色(2)。 一對紅色連接線的拼接(允許多條線路連接到單行線,藍色方塊)

enter image description here

這是怎麼說織機將被保存。

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 ] 
    ] 
} 

連接器數組中的元素包含points數組中的點索引。 每個點對象中的列表數組包含其目標的索引,它們也是點。

我試圖做的功能,以幫助管理索引更容易,只是想知道是否有一種方法來擴展數組,或做出類似的功能合併。使用靜態函數是可以的,這是我一直在使用的。我只想看看我是否可以擴展數組,或者使用類似的東西,所以我不需要使用靜態函數。

+1

元素添加到數組後,元素是否必須保持索引?如果你想刪除一個元素,'array.splice'會做到這一點,重新索引數組並重新計算長度,所以你永遠不會有空插槽,你可以簡單地追加到最後。 –

+0

是的,元素確實需要保持它們的索引,因爲每個元素的值都是一個包含其內部數組的對象,其中包含其他元素的索引。我會在我的問題中添加一些額外的東西,以便使它更清晰一些。 – NickSlash

回答

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"; 

我希望它能幫助。

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),我不確定你是否需要所有這些併發症。

+0

這與我所瞭解的類似,減去跳和跳相關的東西。數組元素只是對象中的編號屬性?不知道爲什麼,但我認爲他們是不同的。 – NickSlash

+2

@NickSlash:是的,但這就是爲什麼你也可以搞亂陣列。例如'delete arr [i]'會將'arr [i]'設爲'undefined',但它不會更新數組的長度。你有沒有讀過我對你的問題的評論?也許如果你能更好地解釋整體問題,我們可以提供更好的解決方案。你基本上要求爲你的解決方案提供解決方案,但是我認爲你讓它變得過於複雜。相反,問問你的問題的解決方案。 –

相關問題