Raphaël ライブラリを使用すると、セットを作成できます。これは、Raphaël 要素を保持する配列のようなオブジェクトであり、要素メソッドが呼び出されたときにそれらの要素を暗黙的にループできます。問題は、セットは配列に似ていますが、プロトタイプのすべての関数がArray
ラファエル セットで使用できるわけではないことArray.concat()
です。2 つの Raphaël セットを新しいセットに連結するにはどうすればよいですか? 元のセットのいずれも変更したくありません。
1 に答える
わかりました、私は方法を考え出しました。その秘密は、ラファエル セットには と呼ばれる文書化されていないプロパティがitems
あることです。これは、セットが保持するラファエル要素の通常の配列です。
Array.splice()
Raphaël セットには、配列から要素を削除したり配列に要素を挿入したりするために使用されるメソッドに似たものがあります。の構文Array.splice()
はanArray.splice(startingIndex, numberOfItemsToRemove, itemToInsert[, anotherItemToInsert...])
. この関数は空のセットを作成し、splice
既存の 2 つのセットの項目を新しいセットに単純に s します。この場合、新しいセットにはofがあるため、 と の両方startingIndex
でnumberOfItemsToRemove
ある必要があります。これは、唯一のインデックスがであり、それ以上の要素を削除できない可能性があることを意味します。0
length
0
0
0
以下の関数は、JavaScript のfunction.apply()
メソッド on splice()
(のようにsplice.apply()
) を使用します。関数内のキーワードに割り当てられる値と、関数の引数になる配列のapply()
2 つの引数を取ります。への引数としてthis
渡す配列を作成できます。この配列の最初の 2 つの項目はとであるため、両方とも に設定されます。後続の引数はすべて、新しいセットに挿入される項目です。この配列を で初期化できます。これはメソッドを持つ実配列です。今しなければならないのは、セットのプロパティから取得できる各セットの要素を、apply()
splice()
startingIndex
numberOfItemsToRemove
0
[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;
}