如何用ExtendScript提取Illustrator中重复名称的PageItems并分组?
在Illustrator中用ExtendScript识别并分组同名PageItem
核心思路
用对象映射的方式按名称归类所有PageItem,可收集所有同名对象(无论是否连续),再筛选出包含2个及以上元素的组,最后执行分组操作。
完整实现代码
var doc = app.activeDocument; var targetLayer = doc.activeLayer; var pageItems = targetLayer.pageItems; // 1. 按名称分组所有PageItem var nameToItems = {}; for (var i = 0; i < pageItems.length; i++) { var item = pageItems[i]; var itemName = item.name; // 若该名称未创建分组数组,则初始化 if (!nameToItems[itemName]) { nameToItems[itemName] = []; } // 将当前对象加入对应名称的数组 nameToItems[itemName].push(item); } // 2. 筛选出包含2个及以上对象的重复组 var duplicateGroups = []; for (var name in nameToItems) { var items = nameToItems[name]; if (items.length >= 2) { duplicateGroups.push({ groupName: name, items: items }); } } // 3. 对每个重复组执行分组操作 for (var j = 0; j < duplicateGroups.length; j++) { var groupData = duplicateGroups[j]; // 创建新分组 var newGroup = targetLayer.groupItems.add(); newGroup.name = "Group_" + groupData.groupName; // 倒序移动对象,保证原堆叠顺序不变 for (var k = groupData.items.length - 1; k >= 0; k--) { groupData.items[k].moveToEnd(newGroup); } }
代码说明
- 按名称分组:使用
nameToItems对象作为映射,键为对象名称,值为对应名称的所有PageItem数组,彻底解决原代码只能识别连续重复项的问题。 - 筛选重复组:遍历映射对象,只保留元素数量≥2的组,确保只处理需要分组的对象。
- 执行分组:
- 创建新组并命名(前缀
Group_避免与原对象名称冲突)。 - 倒序移动对象到组内:Illustrator中对象移动到组里时,先移动的会处于组的底层,倒序操作可保持原图层中的堆叠顺序不变。
- 创建新组并命名(前缀
注意事项
- 若需处理特定图层,可将
activeLayer替换为doc.layers.getByName("目标图层名称")。 - 先收集所有PageItem再处理,避免移动元素导致原数组长度变化引发遍历错误。
内容的提问来源于stack exchange,提问作者fmotion1
相关产品推荐
相关产品推荐

