Как правильно реализовать цикл?



  • Есть дерево каталогов записанное в файл скриптом. Вот небольшой отрезок этого дерева: 0_1538283711304_25.jpg
    Задача - удалить все корневые и промежуточные каталоги (отмечены жёлтым) и оставить только конечные каталоги продукции.

    Пытаюсь реализовать в цикле по принципу: если последующая строка содержит в себе предыдущую, то удаляем предыдущую. Иными словами, все корневые каталоги являются подстроками у любых вложенных в них каталогов, и напротив, конечный каталог не будет являться подстрокой другого конечного каталога.

    Пробую реализовать в коде, но что-то пошло не так:

    var list = VAR_LIST
        var length = list.length
        for (i=0;i<length;i++){
            if (i==0){
                var second = list[i]
            } else {
                var first = list[i]
                var j = i - 1
                var second = list[j]
                if(first.indexOf(second) + 1) {
                    list[j] = '<delete>'
                }
            }
        }
        VAR_NEW_LIST = list
    

    Ставлю вместо удаляемых элементов <delete> и при следующем цикле просто перезаписываю всё, что не "<delete>" в новый список. Иначе если удалять сразу, нумерация массива съезжает.

    Но этот алгоритм удаляет почему-то и конечные каталоги (хотя не все). Не могу понять, где я допустил ошибку.



  • @pragmatik
    Помоему проще удалять: если в строке два /, то удалить строку



  • @forall тогда цикл собъётся и программа перескочит через элемент. Это если в цикле удалять.

    А так удалить надо не только корневые директории, но и промежуточные, оставив только конечные. А у промежуточных уже более двух слэшей.



  • @Pragmatik Это существующие каталоги? Или просто строки?



  • @pragmatik
    Я бы просто в цикле удалял каждую строку, которая является подстрокой любой другой строки.
    Возможно, не самый быстрый метод, но, точно надежный и быстрореализуемый. Если строк не очень много, то работать будет быстро.



  • @pragmatik

    VAR_LIST=VAR_LIST.filter(function(item,i){
    	if(VAR_LIST.length>i+1){
    		return VAR_LIST[i+1].indexOf(item)<0
    	}
    	return true;
    })
    


  • @fox список создан действием "поиск файлов", где я указал искать только папки по маске *. Так что в конечном счёте это существующие каталоги, но работаю со списком для начала.



  • @xclsv так я это и делаю)



  • @denis_krsk благодарю) Совсем забыл что есть filter. Это гораздо удобнее будет.


Log in to reply