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つのコネクタがあります。赤(0)は2行、黄色(1)は3行、緑(2)は2行です。赤いコネクタの線の1つがスプライスされています(複数の線を1本の線(青い四角)に接続できます)

ここに画像の説明を入力してください

これがその織機の保管方法です。

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

コネクタ配列の要素には、ポイント配列のポイントのインデックスが含まれています。各ポイントオブジェクト内のリスト配列には、ポイントでもある宛先のインデックスが含まれています。

インデックスの管理を容易にする関数を作成しようとしています。配列を拡張する方法があるかどうかを知りたい、または機能を組み込んだ同様のものを作成したいだけです。静的関数の使用は問題なく、私が使用してきたものです。配列を拡張できるかどうか、またはそのようなものを使用できるかどうかを確認したかったので、静的関数を使用する必要はありませんでした。

4

2 に答える 2

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)であり、このすべての複雑さが必要かどうかわからないため、これが本当に必要かどうかはわかりません。

于 2012-05-15T18:01:06.677 に答える
0

次のように、配列のプロトタイプにメソッドを追加します。

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

お役に立てば幸いです。

于 2012-05-15T18:03:35.957 に答える