Какъв е правилният начин за изпълнение на всяка функция за много дъщерни възли?

Имам масив и много обекти в него. Искам да мога да изпълнявам всяка функция, за да променя всеки files/a с files/and във всеки subpage > file възли. Как мога да направя това с подходяща функция за всеки или цикъл? Мисля за това и това е структурата по-долу в съзнанието ми и изглежда като ужасно решение.

$.each(main, function( index, value ) {
    $.each(index.subpage, function( index, value ) {
        $.each(index.files, function( index, value ) {
             value.replace("files/a", "files/and");
        });
    });
});

Основният обект изглежда по-долу.

{
    "main": [
        {
            "title": "AAA",
            "hash": "a",
            "subpage": [
                {
                    "title": "b",
                    "hash": "b",
                    "subpage": [
                        {
                            "title": "c",
                            "hash": "c",
                            "subpage": [],
                            "files": [
                                {
                                    "files/a/b/c/01_clandestino_dev%20%282%29.jpg": {}
                                },
                                {
                                    "files/a/b/c/01_clandestino_dev%20%283%29.jpg": {}
                                }
                            ],
                            "content": "",
                            "layout": "standart"
                        }
                    ],
                    "files": [
                        {
                            "files/a/b/01_clandestino_dev%20%282%29.jpg": {}
                        },
                        {
                            "files/a/b/01_clandestino_dev%20%283%29.jpg": {}
                        }
                    ],
                    "content": "asd123",
                    "layout": "standart"
                }
            ],
            "files": [
                {
                    "files/a/01_clandestino_dev.jpg": {}
                },
                {
                    "files/a/01.Creative_Collective_Effect_Overview.jpg": {}
                },
                {
                    "files/a/01.Bor%C3%A5s_H%C3%B6gskola_Website_Narrow.jpg": {}
                }
            ],
            "content": "AAAb",
            "layout": "standart",
            "menuItem": "true"
        }
    ]
}

person fozuse    schedule 21.11.2014    source източник
comment
възможна дупка stackoverflow.com/questions/2203958/   -  person DLeh    schedule 22.11.2014
comment
Структурата на данните изглежда странна. Опитвате се да промените стойността, но всички имена на файлове се показват като ключове на обекти, а не като стойности   -  person charlietfl    schedule 22.11.2014
comment
Мисля, че трябва да изтрия името на файла, преди да добавя преименуван.   -  person fozuse    schedule 22.11.2014


Отговори (1)


Рекурсията е единственото решение. Трябва да напишете функция, която обработва "страница":

  • обработва всяка подстраница в текущата страница с помощта на рекурсия
  • обработва всеки файл в текущата страница

Всеки файл е обект с един ключ; трябва да добавите новия ключ и да премахнете стария ключ, като използвате оператора delete.

var o = {
    "main": [{
        "title": "AAA",
        "hash": "a",
        "subpage": [{
            "title": "b",
            "hash": "b",
            "subpage": [{
                "title": "c",
                "hash": "c",
                "subpage": [],
                "files": [{
                    "files/a/b/c/01_clandestino_dev%20%282%29.jpg": {}
                }, {
                    "files/a/b/c/01_clandestino_dev%20%283%29.jpg": {}
                }],
                "content": "",
                "layout": "standart"
            }],
            "files": [{
                "files/a/b/01_clandestino_dev%20%282%29.jpg": {}
            }, {
                "files/a/b/01_clandestino_dev%20%283%29.jpg": {}
            }],
            "content": "asd123",
            "layout": "standart"
        }],
        "files": [{
            "files/a/01_clandestino_dev.jpg": {}
        }, {
            "files/a/01.Creative_Collective_Effect_Overview.jpg": {}
        }, {
            "files/a/01.Bor%C3%A5s_H%C3%B6gskola_Website_Narrow.jpg": {}
        }],
        "content": "AAAb",
        "layout": "standart",
        "menuItem": "true"
    }]
};

function process_page(page) {
    if (page.main || page.subpage) {
        $.each(page.main || page.subpage, function(i, subpage) {
            process_page(subpage);
        });
    }
    if (page.files) {
        $.each(page.files, function(i, file) {
            $.each(file, function(oldname, value) {
                var newname = oldname.replace("files/a", "files/and");
                console.log("old: " + oldname);
                console.log("new: " + newname);
                file[newname] = value;
                delete file[oldname];
            });
        });
    }
}
process_page(o);
console.log(o);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

person Salman A    schedule 21.11.2014