Рекурсивно сортирует указанный файл c в верхнем каталоге - PullRequest
1 голос
/ 11 апреля 2020

Я ищу способ определения файлов dist. xml, которые находятся в самом верхнем каталоге.

Например, у меня есть этот список списка каталогов,

/opt/pictures/dist.xml
/opt/docs_old/dist.xml
/opt/public/dist.xml
/opt/documents/server/dist.xml
/opt/documents/dist.xml
/opt/documents/web/dist.xml
/opt/documents/class/dist.xml
/opt/documents/lessons/1/dist.xml
/opt/documents/lessons/2/dist.xml
/opt/documents/lessons/3/dist.xml
/opt/documents/lessons/4/dist.xml
/opt/documents/lessons/5/dist.xml
/opt/music/service/day/dist.xml
/opt/music/service/week/dist.xml
/opt/music/service/month/dist.xml
/opt/music/service/month/1/dist.xml
/opt/music/service/month/2/dist.xml

и я хочу получить этот вывод вместо

/opt/pictures/dist.xml
/opt/docs_old/dist.xml
/opt/public/dist.xml
/opt/documents/dist.xml
/opt/music/service/day/dist.xml
/opt/music/service/week/dist.xml
/opt/music/service/month/dist.xml

Я пытаюсь добиться этого в JS. Я думал, что простая сортировка будет работать.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Сортировка не требуется. Поместите все пути в Set, а затем filter массив для тех путей, для которых в наборе нет предка.

var paths = ['/opt/pictures/dist.xml', '/opt/docs_old/dist.xml', '/opt/public/dist.xml', '/opt/documents/server/dist.xml', '/opt/documents/dist.xml', '/opt/documents/web/dist.xml', '/opt/documents/class/dist.xml', '/opt/documents/lessons/1/dist.xml', '/opt/documents/lessons/2/dist.xml', '/opt/documents/lessons/3/dist.xml', '/opt/documents/lessons/4/dist.xml', '/opt/documents/lessons/5/dist.xml', '/opt/music/service/day/dist.xml', '/opt/music/service/week/dist.xml', '/opt/music/service/month/dist.xml', '/opt/music/service/month/1/dist.xml', '/opt/music/service/month/2/dist.xml'];

const all = new Set(paths);
const result = paths.filter(path => {
    const parts = path.split("/");
    const filename = parts.pop();
    return !Array.from({length: parts.length}, (_, i) => i).some(i =>
        all.has(parts.slice(0, i).concat([filename]).join("/"))
    );
});
console.log(result);
1 голос
/ 11 апреля 2020

Вы можете сортировать эти строки по количеству слешей, а затем по символам и фильтровать массив, просматривая видимые пути.

var data = ['/opt/pictures/dist.xml', '/opt/docs_old/dist.xml', '/opt/public/dist.xml', '/opt/documents/server/dist.xml', '/opt/documents/dist.xml', '/opt/documents/web/dist.xml', '/opt/documents/class/dist.xml', '/opt/documents/lessons/1/dist.xml', '/opt/documents/lessons/2/dist.xml', '/opt/documents/lessons/3/dist.xml', '/opt/documents/lessons/4/dist.xml', '/opt/documents/lessons/5/dist.xml', '/opt/music/service/day/dist.xml', '/opt/music/service/week/dist.xml', '/opt/music/service/month/dist.xml', '/opt/music/service/month/1/dist.xml', '/opt/music/service/month/2/dist.xml'],
    result = data
        .sort((a, b) =>
            a.replace(/[^\/]+/g, '').length - b.replace(/[^\/]+/g, '').length ||
            a > b || -(a < b)
        )
        .filter(
            (seen => s =>
                (parts =>
                    !parts.some((_, i, p) => seen.has(p.slice(0, i + 1).join('/'))) &&
                    seen.add(parts.join('/'))
                )
                (s.split('/').slice(0, -1))
            )
            (new Set)
        );

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...