与 Raphaël library ,您可以创建集合,它们是保存 Raphaël 元素的类似数组的对象,并且可以在调用元素方法时隐式循环这些元素。问题是,虽然这些集合是类似数组的,但并非 Array
中的所有函数。原型(prototype)可用于拉斐尔套装,包括 Array.concat()
。如何将两个拉斐尔集连接成一个新集?我不想修改任何原始集。
最佳答案
好吧,我想到了一个办法。 secret 在于拉斐尔集有一个名为 items
的未记录属性。 ,这是该集合所包含的 Raphaël 元素的普通数组。
拉斐尔的一套确实有类似Array.splice()
的东西方法,用于从数组中删除和插入元素。 Array.splice()
的语法是 anArray.splice(startingIndex, numberOfItemsToRemove, itemToInsert[, anotherItemToInsert...])
。该函数创建一个空集,它们只是 splice
将两个现有集合中的项目放入新集合中。在这种情况下,startingIndex
和numberOfItemsToRemove
应该是0
因为新集合有 length
的0
,这意味着唯一的索引是 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
,那么该函数只是创建该集合的副本。
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/