Skip to main content
zawij
Participant
Sep 23, 2014 12:45 PM UTC
Answered

How to sort objects alphabetically (inside of a layer)?

How to sort objects alphabetically (inside of a layer) on layer list?

I have already tried scripts for Layer sorting. They work indeed for the layers, but not the objects themselves packed inside.

This topic is closed to new replies. Start a new post to keep the conversation going.
Jung K Kwon
Jung K KwonCorrect answer
Participating Frequently
Sep 24, 2015 2:26 AM UTC

 

// sort layers and sublayers by Jung K Kwon
// https://community.adobe.com/t5/illustrator-discussions/how-to-sort-objects-alphabetically-inside-of-a-layer/m-p/13462829#M349907

//#target "Illustrator"
var doc = app.activeDocument;
var Top_all_layers = doc.layers;
Arrange_Layers(doc, Top_all_layers);
redraw();

function Arrange_Layers(where, T_Layers_OBJ) {
    var temp_L_names = new Array();
    for (var i = 0; i < T_Layers_OBJ.length; i++) {
        temp_L_names.push(T_Layers_OBJ[i].name);
    }
    sort_layer(where, temp_L_names.sort(naturalCompare));;
    for (var i = 0; i < T_Layers_OBJ.length; i++) {
        if (T_Layers_OBJ[i].layers.length != 0) {
            Arrange_Layers(T_Layers_OBJ[i], T_Layers_OBJ[i].layers);
        }
    }
    return;
}

function sort_layer(where, Layers_Array) {
    var temp_P_names = Array();
    var Sorted_temp_P = Array();
    for (var k = 0; k < Layers_Array.length; k++) {
        var temp_layer = where.layers.getByName(Layers_Array[k]); //
        var status_Lock = temp_layer.locked;
        var status_Preview = temp_layer.preview;
        var status_visible = temp_layer.visible;
        temp_layer.locked = false;
        temp_layer.preview = true;
        temp_layer.visible = true;
        temp_layer.zOrder(ZOrderMethod.SENDTOBACK);
        temp_layer.locked = status_Lock;
        temp_layer.preview = status_Preview;
        temp_layer.visible = status_visible;
    }
    for (var k = 0; k < Layers_Array.length; k++) {
        var temp_layer = where.layers.getByName(Layers_Array[k]); //
        var temp_items = temp_layer.pageItems;
        for (var l = 0; l < temp_items.length; l++) {
            temp_P_names.push(temp_items[l].name);
        }
        Sorted_temp_P = temp_P_names.sort(naturalCompare);
        try {
            for (var l = 0; l < Sorted_temp_P.length; l++) {
                //$.writeln(Sorted_temp_P[l], "--", temp_items);
                var temp_OBJ = temp_layer.pageItems.getByName(Sorted_temp_P[l]);
                temp_OBJ.zOrder(ZOrderMethod.SENDTOBACK);
                //
            } //
        } catch (e) {
            //alert(e); 
        }
    }
    //
}
//
//
function naturalCompare(a, b) {
    var ax = [],
        bx = [];
    a.replace(/(\d+)|(\D+)/g, function(_, $1, $2) {
        ax.push([$1 || Infinity, $2 || ""])
    });
    b.replace(/(\d+)|(\D+)/g, function(_, $1, $2) {
        bx.push([$1 || Infinity, $2 || ""])
    });
    while (ax.length && bx.length) {
        var an = ax.shift();
        var bn = bx.shift();
        var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
        if (nn) return nn;
    }
    return ax.length - bx.length;
}

 

29 replies

Participant
Jan 10, 2024 3:08 AM UTC

Dangit; not working for me. Have there been any changes? The only code I see to copy is the 2015 post, and it's just radio silence after I run it; no errors, but no change to the layers. 

 

 

Translate
CarlosCanto
Community Expert
Community Expert
Jan 10, 2024 4:08 AM UTC

the script from Sep 23, 2015 is the one that works

Translate
Known Participant
Apr 29, 2022 4:04 AM UTC

I keep getting this error. Any help?

Translate
Participant
Aug 18, 2022 7:41 PM UTC

Did you ever get past this? I'm getting the same issue.

 

Translate
Participant
Jan 3, 2023 11:31 PM UTC

Same issue still

Translate
Jung K Kwon
Jung K KwonCorrect answer
Participating Frequently
Sep 24, 2015 2:26 AM UTC

 

// sort layers and sublayers by Jung K Kwon
// https://community.adobe.com/t5/illustrator-discussions/how-to-sort-objects-alphabetically-inside-of-a-layer/m-p/13462829#M349907

//#target "Illustrator"
var doc = app.activeDocument;
var Top_all_layers = doc.layers;
Arrange_Layers(doc, Top_all_layers);
redraw();

function Arrange_Layers(where, T_Layers_OBJ) {
    var temp_L_names = new Array();
    for (var i = 0; i < T_Layers_OBJ.length; i++) {
        temp_L_names.push(T_Layers_OBJ[i].name);
    }
    sort_layer(where, temp_L_names.sort(naturalCompare));;
    for (var i = 0; i < T_Layers_OBJ.length; i++) {
        if (T_Layers_OBJ[i].layers.length != 0) {
            Arrange_Layers(T_Layers_OBJ[i], T_Layers_OBJ[i].layers);
        }
    }
    return;
}

function sort_layer(where, Layers_Array) {
    var temp_P_names = Array();
    var Sorted_temp_P = Array();
    for (var k = 0; k < Layers_Array.length; k++) {
        var temp_layer = where.layers.getByName(Layers_Array[k]); //
        var status_Lock = temp_layer.locked;
        var status_Preview = temp_layer.preview;
        var status_visible = temp_layer.visible;
        temp_layer.locked = false;
        temp_layer.preview = true;
        temp_layer.visible = true;
        temp_layer.zOrder(ZOrderMethod.SENDTOBACK);
        temp_layer.locked = status_Lock;
        temp_layer.preview = status_Preview;
        temp_layer.visible = status_visible;
    }
    for (var k = 0; k < Layers_Array.length; k++) {
        var temp_layer = where.layers.getByName(Layers_Array[k]); //
        var temp_items = temp_layer.pageItems;
        for (var l = 0; l < temp_items.length; l++) {
            temp_P_names.push(temp_items[l].name);
        }
        Sorted_temp_P = temp_P_names.sort(naturalCompare);
        try {
            for (var l = 0; l < Sorted_temp_P.length; l++) {
                //$.writeln(Sorted_temp_P[l], "--", temp_items);
                var temp_OBJ = temp_layer.pageItems.getByName(Sorted_temp_P[l]);
                temp_OBJ.zOrder(ZOrderMethod.SENDTOBACK);
                //
            } //
        } catch (e) {
            //alert(e); 
        }
    }
    //
}
//
//
function naturalCompare(a, b) {
    var ax = [],
        bx = [];
    a.replace(/(\d+)|(\D+)/g, function(_, $1, $2) {
        ax.push([$1 || Infinity, $2 || ""])
    });
    b.replace(/(\d+)|(\D+)/g, function(_, $1, $2) {
        bx.push([$1 || Infinity, $2 || ""])
    });
    while (ax.length && bx.length) {
        var an = ax.shift();
        var bn = bx.shift();
        var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
        if (nn) return nn;
    }
    return ax.length - bx.length;
}

 

Translate
Aristarco Palacios
Known Participant
Jun 12, 2017 8:18 PM UTC

Works great for me!

Script debugging window keeps appearing though. Is it because of the catch(e)? Or did I name it wrong and it is a .jsx and not a .js?

Thanks again!!

EDIT: Never mind, I found it!

Translate
CarlosCanto
Community Expert
Community Expert
Sep 23, 2014 2:38 PM UTC

post your script, someone will help you tweak it to work with the objects instead of layers,

Translate
zawij
zawijAuthor
Participant
Sep 23, 2014 2:41 PM UTC

It is not my script, but it works with layers. I found it googling some time ago.

#target "Illustrator" 

  

/*

     sort layers (with sublayer)

*/ 

  

var doc = app.documents[0]; 

var lay = doc.layers; 

var array_primary = []; 

for (var i=0, iL=lay.length; i < iL ; i++) { 

     if (lay.layers.length === 0) { 

          array_primary.push( lay.name ); 

     } 

     else { 

          array_primary.push( lay.name ); 

          var array_secondary = []; 

          for (var j=0, jL=lay.layers.length; j < jL ; j++) { 

           array_secondary.push(lay.layers.name); 

          }; 

          var result2 = array_secondary.sort( function (a,b) { return a > b }); 

          // sort sublayers 

          sort_layer (lay, result2); 

     } 

}; 

var result1 = array_primary.sort( function(a,b) { return a > b } ); 

  

// sort layers 

sort_layer (doc, result1); 

  

function sort_layer (obj, array) { 

     for (var ri=0, riL=array.length; ri < riL ; ri++) { 

          obj.layers.getByName(array[ri]).zOrder( ZOrderMethod.SENDTOBACK ); 

     }; 

} 

Translate