1

Raphaël ライブラリを使用すると、セットを作成できます。これは、Raphaël 要素を保持する配列のようなオブジェクトであり、要素メソッドが呼び出されたときにそれらの要素を暗黙的にループできます。問題は、セットは配列に似ていますが、プロトタイプのすべての関数がArrayラファエル セットで使用できるわけではないことArray.concat()です。2 つの Raphaël セットを新しいセットに連結するにはどうすればよいですか? 元のセットのいずれも変更したくありません。

4

1 に答える 1

1

わかりました、私は方法を考え出しました。その秘密は、ラファエル セットには と呼ばれる文書化されていないプロパティがitemsあることです。これは、セットが保持するラファエル要素の通常の配列です。

Array.splice()Raphaël セットには、配列から要素を削除したり配列に要素を挿入したりするために使用されるメソッドに似たものがあります。の構文Array.splice()anArray.splice(startingIndex, numberOfItemsToRemove, itemToInsert[, anotherItemToInsert...]). この関数は空のセットを作成し、splice既存の 2 つのセットの項目を新しいセットに単純に s します。この場合、新しいセットにはofがあるため、 と の両方startingIndexnumberOfItemsToRemoveある必要があります。これは、唯一のインデックスがであり、それ以上の要素を削除できない可能性があることを意味します。0length000

以下の関数は、JavaScript のfunction.apply()メソッド on splice()(のようにsplice.apply()) を使用します。関数内のキーワードに割り当てられる値と、関数の引数になる配列のapply()2 つの引数を取ります。への引数としてthis渡す配列を作成できます。この配列の最初の 2 つの項目はとであるため、両方とも に設定されます。後続の引数はすべて、新しいセットに挿入される項目です。この配列を で初期化できます。これメソッドを持つ実配列です。今しなければならないのは、セットのプロパティから取得できる各セットの要素を、apply()splice()startingIndexnumberOfItemsToRemove0[0, 0]concat()concat()item[0, 0]splice()、新しい空のセットのメソッドに渡される引数の配列を作成します。

function concatSets(paper, setA, setB){
    var newSet = paper.set(); // Creates a new, empty set
    newSet.splice.apply(newSet, [0, 0].concat(setA.items, setB.items));
    return newSet;
}

以下の関数は、必要な数のセットを連結できます。セットの配列を 2 番目の引数として渡し、紙オブジェクトを最初の引数として渡すだけです。の場合arrayOfSets.length == 1、関数は単にセットのコピーを作成します。

function concatManySets(paper, arrayOfSets){
    var i, newSet, argsToPass;
    argsToPass = [0, 0]; // The first two parameters of a normal call to Array.splice()
    newSet = paper.set(); // Creates a new, empty set
    for(i = 0; i < arrayOfSets.length; i++){
        argsToPass = argsToPass.concat(arrayOfSets[i].items);
    }
    newSet.splice.apply(newSet, argsToPass);
    return newSet;
}
于 2013-07-27T01:30:18.533 に答える