使用Raphaël library,您可以创建集合,这些集合是类似于数组的对象,可以保存Raphaël元素,并且可以在调用元素方法时隐式循环这些元素。问题是尽管这些集合是类,但并不是Array
原型中的所有函数都可用于Raphaël集,包括Array.concat()
。如何连接两个Raphaël套件并换成一个新套件?我不想修改任何一个原始集。
答案 0 :(得分:1)
好的,我想出了办法。秘密是Raphaël集合有一个名为items
的未记录的属性,这是该集合所持有的Raphaël元素的正常数组。
Raphaël集合确实具有与Array.splice()
方法类似的东西,用于从数组中删除和插入元素。 Array.splice()
的语法是anArray.splice(startingIndex, numberOfItemsToRemove, itemToInsert[, anotherItemToInsert...])
。该函数创建一个空集,它们只是splice
将两个现有集合中的项目放入新集合中。在这种情况下,startingIndex
和numberOfItemsToRemove
都应为0
,因为新集的length
为0
,这意味着唯一的索引是{{} 1}}并且您不可能删除超过0
个元素。
以下函数在0
上使用JavaScript的function.apply()
方法(如splice()
中所述)。 splice.apply()
有两个参数:一个赋值给函数内部apply()
关键字的值和一个成为函数参数的数组。我们可以创建一个数组作为this
的参数传递给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;
}
,则该函数只创建该集的副本。
arrayOfSets.length == 1