使用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放入新集中。在这种情况下,startingIndexnumberOfItemsToRemove都应为0,因为新集的length0,这意味着唯一的索引是0,并且您可能无法删除更多比0元素。

下面的函数在function.apply()上使用JavaScript的splice()方法(与splice.apply()相同)。 apply()带有两个参数:一个在函数内部分配给this关键字的值和一个成为函数参数的数组。我们可以创建一个数组传递给apply()作为splice()的参数。此数组中的前两项是startingIndexnumberOfItemsToRemove,因此它们都将设置为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/

10-16 06:51