Преобразование объекта рекурсивно

Nikita спросил: 07 октября 2018 в 11:17 в: javascript

У меня есть объект или массив объектов с реквизитами, содержащими строки, массивы и другие объекты.

Я хочу преобразовать вложенные массивы, содержащие объекты с языком поддержки, в объект с языком в качестве ключа и сам объект в качестве проп.

Допустим, я хочу рекурсивно преобразовать этот объект:

{
    "WhatPage": [
        {
            "id": 1,
            "WhatPageTranslations": [
                {
                    "id": 1,
                    "title": "What",
                    "WhatPageId": 1,
                    "language": "en"
                },
                {
                    "id": 2,
                    "title": "Qué",
                    "WhatPageId": 1,
                    "language": "es"
                },
            ],
            "WhatPageImages": [
                {
                    "id": 1,
                    "title": "image title 1",
                    "WhatPageId": 1,
                    "WhatPageImagesTranslations": [
                        {
                            "id": 1,
                            "title": "What",
                            "WhatPageImageId": 1,
                            "language": "en"
                        },
                        {
                            "id": 2,
                            "title": "Qué",
                            "WhatPageImageId": 1,
                            "language": "es"
                        },
                    ]
                },
            ]
        }
    ]
}

Затем я могу использовать эту функцию, которая проверяет, является ли ее массив или объект и рекурсивно преобразовывать данные:

export const transformTranslatedData = function(data) {
    var clonedData = JSON.parse(JSON.stringify(data));
    const transform = function(data) {
        for (var prop in data) {
            if (data[prop].length > 0 && data[prop] instanceof Array && data[prop][0].hasOwnProperty('language')) {
                var transformedData = data[prop].reduce(function(prev, current, index) {
                    prev[current.language] = current;                    return prev;
                }, {});
                data[prop] = transformedData;            } else if (data[prop] instanceof Object && !(data[prop] instanceof Array)) {
                transformTranslatedData(data[prop]);
            } else if (data[prop] instanceof Array) {
                let array = JSON.parse(JSON.stringify(data[prop]));
                array.forEach((item) => {
                    transformTranslatedData(item);
                });
            }
        }        return data;
    };
    if (clonedData instanceof Array) {
        var newData = [];
        clonedData.map((item) => {
            newData.push(transform(item));
        });
    } else if (clonedData instanceof Object && !(clonedData instanceof Array)) {
        var newData = {};        newData = transform(clonedData);
    }    return newData;
};

Это работает, но только для первого уровня объекта - WhatPageTranslations -. На втором уровне, когда он достигает WhatPageImagesTranslations, он преобразует данные, но эти данные не добавляются к объекту.

Если кто-нибудь знает, почему это происходит, я буду благодарен!

0 ответов