Skip to main content
zawij
Participant
September 23, 2014
Answered

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

  • September 23, 2014
  • 4 replies
  • 26381 views

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 has been closed for replies.
Correct answer Jung K Kwon

 

// 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;
}

 

4 replies

Participant
January 10, 2024

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. 

 

 

CarlosCanto
Community Expert
Community Expert
January 10, 2024

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

Known Participant
April 29, 2022

I keep getting this error. Any help?

Participant
August 18, 2022

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

 

Participant
January 3, 2023

Same issue still

Jung K Kwon
Jung K KwonCorrect answer
Participating Frequently
September 24, 2015

 

// 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;
}

 

Aristarco Palacios
Known Participant
June 12, 2017

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!

CarlosCanto
Community Expert
Community Expert
September 23, 2014

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

zawij
zawijAuthor
Participant
September 23, 2014

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 ); 

     };