2016-01-06 15 views
5

は単にundefinedである要素と混同すべきではない、それぞれのインデックスのギャップを有していてもよい自分の欠点を補う何らかの利益を伴います可能な限り避けるべきであるかどうかわからないlengthプロパティ。もしそうなら、私はデフォルトでエッジケースとして扱うとしません:は、それぞれのインデックスのギャップとの配列を行いJavaScript配列で

// default: 
function head(xs) { 
    return xs[0]; 
} 

// only when necessary: 
function gapSafeHead(xs) { 
    var i; 

    for (i = 0; i < xs.length; i++) { 
    if (i in xs) { 
     return xs[i]; 
    } 
    } 
} 

headは非常に簡潔であるという事実のほかに、もう一つの利点は、それがすべてのアレイのようなデータ型に使用することができることです。 headはほんの一例です。このようなギャップをコード全体で考慮する必要がある場合は、オーバーヘッドが大幅に大きくなるはずです。

+3

私は、一度、疫病のようなギャップを避けます。 –

+0

もしそれらが本当にインデックスであり、 "古典的な"配列を使用するならば、それはギャップを避けるのが理にかなっています。あなたの配列を数値プロパティを持つオブジェクトとして扱うと、ギャップに間違いはありません。 –

答えて

2

これは、「配列」と呼ばれるものを提供するためにハッシュテーブルをオーバーロードする言語で発生する可能性があります。 PHP、Lua、JavaScriptは3つの言語です。厳密なシーケンシャルな数値配列の振る舞いに依存している場合、それはあなたには不便です。より一般的には、その動作は便利さをも提供します。

これは古典的なアルゴリズムの質問です。データ構造の中間からメンバーを削除するには、どのデータ構造が「より良い」ものであるべきですか?リンクされたリストまたは配列ですか?

リンクされたリストからノードを削除する場合、残りの配列を1つのインデックスに移動する必要がないため、「リンクされたリスト」と言うことにします。しかし、リンクされたリストには他にも落とし穴があります。スパース配列*を使用できます。

このハッシュタイプの配列を提供する多くの言語では、配列の任意のメンバーを削除すると長さが変更されます。残念ながら、JavaScriptは長さを変更しないので、そこで少し失うことになります。それにもかかわらず、アレイは少なくともObject.keysの観点からは「より短い」。

*多くのsparse arraysはリンクリストを使用して実装されているため、あまりにも一般的には適用しないでください。しかし、これらの言語では、予測可能な順序付き数値キーを持つハッシュテーブルです。

+0

理論的背景と例をありがとう。その方法で配列を使用するjs libに名前を付けることはできますか(スパース配列として)?それは助けになるだろう! – rand

+0

具体的な記述はありませんが、スパース配列は[JavaScript:The Definitive Guide](https://www.safaribooksonline。com/library/view/javascript-the-definitive/9781449393854/ch07s03.html)と[Dr. Axel Rauschmayerの優れたブログ](http://www.2ality.com/2012/06/dense-arrays.html?m=1)。 Pythonのlibにある "ここではリストの理解です"と言ったように、libの疎配列を呼び出すのは奇妙です。これは言語の単なる機能です。それが使用されている場合、それは当然のこととして使用されます。 – kojiro

1

もちろん、質問は主観的なものですが、できる限り間違いを避けるべきだと私は主張します。配列は特別な目的を持った特別なJavascriptオブジェクトです。配列を完全にハックしたり、長さプロパティを操作したり、数値以外のキー(たとえばmyArray ["foo"] = "bar")でプロパティを追加することはできますが、これらは主に反パターンになります。特別な形式の擬似配列が必要な場合は、通常のオブジェクトを使ってコード化することができます。結局のところ、typeof [] === "object"

本質的にギャップがコードを壊すようなことではありませんが、私はそれらを意図的に追いかけません。

あなたの質問にお答えしますか?

+0

明白な欠点を上回るギャップを持つアレイの利点を示す例を誰も見せられない場合は、私の質問に答えます – rand

関連する問題