Как сгладить вложенный массив объектов в javascript, который создает новую запись массива каждый раз, когда он находит массив в качестве значения? - PullRequest
2 голосов
/ 04 мая 2020

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

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

Я открыт для любой библиотеки или собственного решения js, которое может служить цели.

Ввод:

[
    {
        key1:'1',
        key2:'2',
        key3:[
            {
                key4:'3',
                key5:{
                    key6:'4',
                    key7:'5',
                    key8:{
                        key9:'6'
                    }
                },
                key10:{
                    key11:'7'
                },
                key12:[
                    {
                        key13:'8'
                    },
                    {
                        key13:'9'
                    }
                ]
            },
            {
                key4:'10',
                key5:{
                    key6:'11',
                    key7:'12',
                    key8:{
                        key9:'13'
                    }
                },
                key10:{
                    key11:'14'
                },
                key12:[
                    {
                        key13:'15'
                    },
                    {
                        key13:'16'
                    }
                ]
            }
        ]
    }
]

** Выход: **

[
    {
        key1:'1',
        key2:'2',
        key4:'3',
        key6:'4',
        key7:'5',
        key9:'6',
        key11:'7',
        key13:'8',
    },
    {
        key1:'1',
        key2:'2',
        key4:'3',
        key6:'4',
        key7:'5',
        key9:'6',
        key11:'7',
        key13:'9'
    },
    {
        key1:'1',
        key2:'2',
        key4:'10',
        key6:'11',
        key7:'12',
        key9:'13',
        key11:'14',
        key13:'15',
    },
    {
        key1:'1',
        key2:'2',
        key4:'10',
        key6:'11',
        key7:'12',
        key9:'13',
        key11:'14',
        key13:'16'
    }
]

1 Ответ

4 голосов
/ 04 мая 2020

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

const
    isObject = value => value && typeof value === 'object',
    getFlatCartesian = object => Object
        .entries(object)
        .reduce((r, [k, v]) => {
            var temp = [];
            r.forEach(s => (Array.isArray(v) ? v : [v]).forEach(w =>
                (isObject(w) ? getFlatCartesian(w) : [w]).forEach(x =>
                    temp.push(isObject(x) ? { ...s, ...x } : { ...s, [k]: x })
                )
            ));
            return temp;
        }, [{}]);

var data = [{ key1: '1', key2: '2', key3: [{ key4: '3', key5: { key6: '4', key7: '5', key8: { key9: '6' } }, key10: { key11: '7' }, key12: [{ key13: '8' }, { key13: '9' }] }, { key4: '10', key5: { key6: '11', key7: '12', key8: { key9: '13' } }, key10: { key11: '14' }, key12: [{ key13: '15' }, { key13: '16' }] }] }],
    result = getFlatCartesian(data);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...