Массив Массив преобразовать в один массив объектов в JavaScript - PullRequest
0 голосов
/ 19 января 2019

У меня есть массив массивов, как показано ниже: -

[
        {
            subsets:
                [
                    {
                        start: '0020', end: '007F',
                    },
                    {
                        start: '0020', end: '007G',
                    },
                    {
                        start: '0020', end: '007G',
                    },
                ],
            fontFormat: 'woff2',
            src: 'estPath1/',
        },
        {
            subsets:
                [
                    {
                        start: '0020', end: '007F',
                    },
                    {
                        start: '0020', end: '007G',
                    },
                    {
                        start: '0020', end: '007G',
                    },
                ],
            fontFormat: 'woff',
            src: 'estPath2/',
        },

    ],

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

[
    {
        subset: [
            {
                start: '0020', end: '007F',
            },
            {
                start: '0020', end: '007G',
            },
            {
                start: '0020', end: '007G',
            },
        ],
        webFontList: [
            {
                fontFormat: 'woff2',
                src: 'estPath1/',
            },
            {
                fontFormat: 'woff',
                src: 'estPath2/',
            },
        ],

    },
];

Я использую lodash в javascript, может кто-нибудь подсказать мне, какое решение будет эффективным.

Мой подход состоит в том, чтобы получить массив уникальных подмножеств из вышеуказанного массива с помощью функции lodash uniqueby, а затем получить все объекты из основного массива, имеющего ключ подмножеств, и создать мой пользовательский объект.

Это не эффективное решение, поэтому нужно искать больше идей.

Ответы [ 3 ]

0 голосов
/ 19 января 2019

этот код поможет вам объединить все данные в вашем массиве:

let test = [
        {
            subsets:
                [
                    {
                        start: '0020', end: '007F',
                    },
                    {
                        start: '0020', end: '007G',
                    },
                    {
                        start: '0020', end: '007G',
                    },
                ],
            fontFormat: 'woff2',
            src: 'estPath1/',
        },
        {
            subsets:
                [
                    {
                        start: '0020', end: '007F',
                    },
                    {
                        start: '0020', end: '007G',
                    },
                    {
                        start: '0020', end: '007G',
                    },
                ],
            fontFormat: 'woff',
            src: 'estPath2/',
        },
        {
            subsets:
                [
                    {
                        start: '0020', end: '007F',
                    },
                    {
                        start: '0021', end: '007G',
                    },
                    {
                        start: '0020', end: '007G',
                    },
                ],
            fontFormat: 'woff',
            src: 'estPath3/',
        }
    ];
    var final = [];
    for(var i = 0; i < test.length; i++) {
        var object = {subsets : [] , webFontList: []};
        object.subsets = test[i].subsets;
        object.webFontList.push({fontFormat: test[i].fontFormat, src: test[i].src});
        for(var j = i +1; j < test.length; j++) {
            if(_.isEqual(test[i].subsets, test[j].subsets)) {
                object.webFontList.push({fontFormat: test[j].fontFormat, src: test[j].src});
                test.splice(j, 1);
            }
        }
        final.push(object);
    }
    console.log("final object is : ", final);
0 голосов
/ 19 января 2019

Вот решение:

 const fontList = params.fontList.map((font) => {
        const uniquesubset = _.compact(_.map(_.uniqWith(font.webFontList, (item, itemTwo) => _.isEqual(item.subset, itemTwo.subset)).map(_.property('subset'))));
        if (uniquesubset.length > 0) {
            const subsets = uniquesubset.map((subset) => {
                const webFontList = _.compact(_.map(font.webFontList, webFont => (_.isEqual(webFont.subset, subset) ? _.pick(webFont, ['fontFormat', 'src', ]) : undefined)));
                const updatedWebFontList = _.compact(webFontList);
                return {
                    subset,
                    webFontList: updatedWebFontList,
                };
            });
            return {
                subsets,
                sourceFont: font.sourceFont,
            };
        }
        return {
            sourceFont: font.sourceFont,
            subsets: {
                webFontList: font.webFontList,
            },
        };
    });

Я буду дополнительно оптимизировать его.Но это дает мне именно то, что мне нужно.

0 голосов
/ 19 января 2019

Вы можете использовать уменьшить для создания нового массива, имея lodash для проверки, если вы уже нашли то же подмножество.

const data = [{
    subsets: [{
        start: '0020', end: '007G',
    }, {
        start: '0020', end: '007F',
    },{
        start: '0020', end: '007G',
    }],
    fontFormat: 'woff2',
    src: 'estPath1/',
},{
    subsets:[{
        start: '0020', end: '007F',
    },{
        start: '0020', end: '007G',
    },{
        start: '0020', end: '007G',
    }],
    fontFormat: 'woff',
    src: 'estPath2/',
}];

const merge = (data) =>
    
    data.reduce((acc, { subsets, fontFormat, src }) => {

        const found = acc.find(({ subset }) => 
            _.isEqual(
                _.sortedIndexBy(subset, ({ start, end }) => start - end), 
                _.sortedIndexBy(subsets, ({ start, end }) => start - end))
            );

        if (!found) acc.push({ subset: subsets, webFontList: [{ fontFormat, src }] });

        else found.webFontList.push({ fontFormat, src });
        
        return acc;
    },
    []);

console.log(merge(data));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
...