使用Raphaël library,您可以创建集合,这些集合是包含Raphaël元素的类似数组的对象,并且在调用element方法时可以隐式循环这些元素。问题是,尽管这些集合类似于数组,但Array
原型中的所有函数并非都可用于Raphaël集合,包括Array.concat()
。如何将两个拉斐尔组合成一个新的组合?我不想修改任何原始集。
最佳答案
好吧,我想出了办法。秘密在于Raphaël集具有未记录的称为items
的属性,这是该集所保存的Raphaël元素的常规数组。
Raphaël集确实具有与Array.splice()
方法相似的方法,该方法用于从数组中删除元素或将元素插入数组。 Array.splice()
的语法为anArray.splice(startingIndex, numberOfItemsToRemove, itemToInsert[, anotherItemToInsert...])
。该函数创建一个空集,它们将来自两个现有集中的项目简单地splice
放入新集中。在这种情况下,startingIndex
和numberOfItemsToRemove
都应为0
,因为新集的length
为0
,这意味着唯一的索引是0
,并且您可能无法删除更多比0
元素。
下面的函数在function.apply()
上使用JavaScript的splice()
方法(与splice.apply()
相同)。 apply()
带有两个参数:一个在函数内部分配给this
关键字的值和一个成为函数参数的数组。我们可以创建一个数组传递给apply()
作为splice()
的参数。此数组中的前两项是startingIndex
和numberOfItemsToRemove
,因此它们都将设置为0
。所有后续参数都是要插入到新集中的项目。我们可以使用[0, 0]
初始化此数组,这是一个真正的数组,确实具有concat()
方法。现在我们要做的就是将每个集合的元素concat()
从集合的item
属性中获取到[0, 0]
的末尾,创建一个将传递给新的空集的方法。
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;
}
下面的函数可以根据需要连接任意多个集合。只需传入一组集合作为第二个参数,并将纸对象作为第一个参数。如果为
splice()
,则该函数仅创建该集的副本。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;
}
关于javascript - 串联拉斐尔集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17893400/