1

Тема: Хвункція сплющування об'єктів (та масивів)

Хотів був написати функцію, котра б отримувала на вхід об'єкт (котрий може містити в собі й інші об'єкти, і масиви) і повертала б об'єкт з глибиною 1, тобто, поля цього об'єкту повинні містити лише прості значення. І якщо в цьому об'єкті були інші об'єкти, то значення їх полів повинні додаватись до того, сплющеного об'єкту.
Ну, ви зрозуміли. Англіцькою то буде flattening, чи якось так.

Ось, накидав код, ніби працює, але може я чогось не догледів, а ви помітите. Я ж з рекурсією погано дружу, тому треба, аби хтось інший теж на то глянув.

function flattenObject(obj, name) {
    if (Array.isArray(obj)) {
        return obj.reduce((acc, curr, index) => {
            const newName = name ? `${name}_${index}` : index;
            if (curr === obj) {
            } else
            if (Array.isArray(curr)) {
                return {
                    ...acc,
                    ...flattenObject(curr, newName)
                };
            } else if (curr instanceof Object) {
                return {
                    ...acc,
                    ...flattenObject(curr, newName)
                };
            }
            acc[newName] = curr;
            return acc;
        }, {})
    } else if (obj instanceof Object) {
        return Object.entries(obj).reduce((acc, curr) => {
            const newName = name ? `${name}_${curr[0]}` : curr[0];
            if (curr[1] === obj) {
                /* {self: obj}; */
            } else
            if (Array.isArray(curr[1])) {
                return {
                    ...acc,
                    ...flattenObject(curr[1], newName)
                };
            } else if (curr[1] instanceof Object) {
                return {
                    ...acc,
                    ...flattenObject(curr[1], newName)
                };
            }
            if (name) {
                acc[`${name}_${curr[0]}`] = curr[1];
            } else {
                acc[curr[0]] = curr[1];
            }
            return acc;
        }, {});
    }
    return obj;
}

console.log(flattenObject(tooMany));

2

Re: Хвункція сплющування об'єктів (та масивів)

Sxoge na operator rozpaku.

Подякували: ExPy, leofun01, FakiNyan3

3

Re: Хвункція сплющування об'єктів (та масивів)

let obj = {
    ref: null
};
obj.ref = obj;

console.log(flattenObject(obj));

InternalError: too much recursion

Подякували: FakiNyan1

4

Re: Хвункція сплющування об'єктів (та масивів)

leofun01 написав:
let obj = {
    ref: null
};
obj.ref = obj;

console.log(flattenObject(obj));

InternalError: too much recursion

так хто ж так робе! не псуйте мені настрій, зараз забаню!11

5

Re: Хвункція сплющування об'єктів (та масивів)

leofun01 написав:
let obj = {
    ref: null
};
obj.ref = obj;

console.log(flattenObject(obj));

InternalError: too much recursion

пофіксав, перевіряйте

Подякували: leofun011

6

Re: Хвункція сплющування об'єктів (та масивів)

Поламав:

let obj = {
    inner: {ref:null}
};
obj.inner.ref = obj;
console.log(flattenObject(obj));

>>Uncaught RangeError: Maximum call stack size exceeded

Вам треба множину пройдених об'єктів створювати і перевіряти, чи нема там.

Подякували: FakiNyan, leofun012

7

Re: Хвункція сплющування об'єктів (та масивів)

koala написав:

Поламав:

let obj = {
    inner: {ref:null}
};
obj.inner.ref = obj;
console.log(flattenObject(obj));

>>Uncaught RangeError: Maximum call stack size exceeded

Вам треба множину пройдених об'єктів створювати і перевіряти, чи нема там.

в моєму випадку циклічні посилання виключені, так шо і так норм

8 Востаннє редагувалося Torbins (29.07.2020 22:25:55)

Re: Хвункція сплющування об'єктів (та масивів)

"Сплющування" будь-яких даних - це в загальному випадку операція із втратою даних. Наприклад, для вашого алгоритму:

obj = {
    A: {B_C:"Some text"},
    A_B: {C:"Other text"}
};

Тому як мінімум треба вводити обмеження на використання символу підкреслення, або екранувати його. Але якщо екранувати, то у вас назва поля зміниться.

Подякували: leofun01, FakiNyan2