Как правильно запустить каждую функцию для многих дочерних узлов?

У меня есть массив и много объектов в нем. Я хочу иметь возможность запускать каждую функцию для изменения каждого 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