Как сгладить массив в фотошопе?

Вот мой код:

var doc = app.activeDocument;
var allLayers = new Array;
var allLayers = collectAllLayers(doc, allLayers);

function collectAllLayers (doc, allLayers){
    for (var m = 0; m < doc.layers.length; m++){
        var theLayer = doc.layers[m];
        if (theLayer.typename === "ArtLayer"){
            allLayers.push(theLayer);
        }else{
            collectAllLayers(theLayer, allLayers);
        }
    }
    return allLayers;
}
alert("array_layers : " + allLayers);

Я получаю такой массив предупреждений

[Layer1],[Layer2],[Layer3];

и я хочу, чтобы это выглядело так:

[Layer1,Layer2,Layer3];

Заранее спасибо за ответы и помощь!

Нет возможности редактировать текст награды? приведенные выше примеры кода стали супер уродливыми!

Ghoul Fool 04.07.2019 20:57

@GhoulFool, возможно, этот код уже работает нормально. Рассмотрим, как alert([{}, {}, {}]) отображает [object Object],[object Object],[object Object]. Возможно, вопрос возник в результате неправильного понимания отображаемой строки.

Patrick Roberts 04.07.2019 21:32

@ Патрик Робертс то же самое, о чем я думал. поэтому, если theLayer является массивом, это может быть сделано allLayers.push (... theLayer);

Bob White 04.07.2019 21:36

@BobWhite Я сомневаюсь, что Photoshop JavaScript поддерживает синтаксис распространения. Коллекции - это даже не массивы, поэтому reduce() и flat() не являются функциями.

Patrick Roberts 04.07.2019 21:38

@PatrickRoberts Думаю, вы правы. Ну что ж, 50 идет насмарку!

Ghoul Fool 04.07.2019 22:03

@GhoulFool может потратить их на меня;)

Patrick Roberts 04.07.2019 22:03

@PatrickRoberts Так же легко, как и альтруизм, разве вам не нужен для этого ответ? :)

Ghoul Fool 04.07.2019 22:45

@GhoulFool, почему бы тебе не посмотреть ответы, размещенные ниже, и не убедиться в этом сам ...

Patrick Roberts 04.07.2019 22:47

@PatrickRoberts Houston, у нас проблема с обновлением экрана ...

Ghoul Fool 04.07.2019 23:17

Привет, @GhoulFool! В настоящее время у меня нет Photoshop (после обновления Windows), чтобы проверить свой ответ. Но я думаю, что return Array.from(allLayers).flat() может помочь. Совместимость из Array.from()

vrintle 05.07.2019 15:29

@ rv7 Array.from не является функцией Photoshop JavaScript.

Ghoul Fool 05.07.2019 18:46

попробуйте: `` allLayers.join (',');

Hossein Shourabi 10.07.2019 05:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
12
298
5

Ответы 5

Как насчет использования allLayers.push(theLayer[0]); вместо allLayers.push(theLayer);.

Хорошая попытка! К сожалению, это просто превращает слои массива: [Artlayer 2], [ArtLayer 1], [ArtLayer Background] в слои массива: ,,

Ghoul Fool 04.07.2019 21:34

Код в вопросе делать отображает одноуровневый массив объектов ArtLayer. Можно запутаться, потому что метод toString объекта ArtLayer возвращает имя слоя в квадратных скобках (в версии PS, которую я установил (v19.1.5), строка «ArtLayer» отображается перед именем слоя, но все еще внутри квадратных скобок) . Например:

var doc = app.activeDocument;
alert(doc.layers[0]); // Alerts "[ArtLayer Layer 1]"

Alert window

Сглаживание массиваary вы можете использовать [].concat.apply([], ary), например:

var ary = [1, ["A", "B", "C"], 3];
alert(ary[2]); // Alerts "3"
alert([].concat.apply([],ary)[2]); // Alerts "B"

Пример concat() не имеет значения. Как вы отметили, код в вопросе уже правильно генерирует плоский массив.

Patrick Roberts 04.07.2019 21:44

@PatrickRoberts Я согласен, это не актуально в коде OP; Я решил включить его, потому что заголовок вопроса: «Как сгладить массив в Photoshop?».

ArtuX 04.07.2019 21:51

Рассматриваемый код уже работает правильно. Ссылаясь на документацию по ArtLayer, вы можете доказать это, распечатав некоторые свойства для каждого из объектов в массиве:

function collectAllLayers (layerSet, layers){
    for (var i = 0; i < layerSet.layers.length; i++){
        var layer = layerSet.layers[i];

        if (layer.typename === "ArtLayer"){
            layers.push(layer);
        } else {
            collectAllLayers(layer, layers);
        }
    }

    return layers;
}

function printable (artLayers) {
    var layerDescriptions = [];

    for (var i = 0; i < artLayers.length; i++) {
        var layer = artLayers[i];

        layerDescriptions.push(
            '{ name: ' + layer.name +
            ', kind: ' + layer.kind +
            ', opacity: ' + layer.opacity +
            ', visible: ' + layer.visible +
            ' }'
        );
    }

    return layerDescriptions;
}

var artLayers = collectAllLayers(app.activeDocument, []);
var layerDescriptions = printable(artLayers);

alert(layerDescriptions);

вы можете использовать

const flatten = (layers, allLayers) => layers.reduce((acc,layer) => (Array.isArray(layer)) ? collectAllLayers(layer, acc) : acc.push(layer), allLayers);

const collectAllLayers = (doc, allLayers) => flatten(doc.layers, allLayers);

Вы пытались свести список к рекурсивному результату?

var doc = app.activeDocument;
var allLayers = new Array;
var allLayers = collectAllLayers(doc, allLayers);

function collectAllLayers (doc, allLayers){
    for (var m = 0; m < doc.layers.length; m++){
        var theLayer = doc.layers[m];
        if (theLayer.typename === "ArtLayer"){
            allLayers.push(theLayer);
        }else{
            flatten(collectAllLayers(theLayer, allLayers));
        }
    }
    return flatten(allLayers);
}

function flatten(arr) {return arr.reduce(
  (a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []
)};

alert("array_layers : " + allLayers);

Другие вопросы по теме