You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:57:41