如何分组数组 [英] How to group array

查看:89
本文介绍了如何分组数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用相同的标签对相似的对象进行分组。

I am trying to group similar objects with the same label.

目前,这是我收到的JSON。

At the moment, this is the the JSON I receive.

const sizes = [{
        id: [{
            value: '2496',
            label: 'XS'
        }, {
            value: '2499',
            label: 'S'
        }],
        type: 'First Size'
    }, {
        id: [{
            value: '2863',
            label: 34
        }, {
            value: '2866',
            label: 36
        }],
        type: 'Shoe Sizes'
    }, {
        id: [{
            value: '3561',
            label: 'XS'
        }, {
            value: '3563',
            label: 'S'
        }, {
            value: '3565',
            label: 'L'
        }, , {
            value: '3567',
            label: 'XL'
        }]
    }, {
        id: [{
            value: '3523',
            label: 34
        }, {
            value: '2866',
            label: 36
        }],
        type: 'Shoe Sizes'
    }]

我想要达到的结果是

const sizes = [{
        id: [{
            value: '2496,3561',
            label: 'XS'
        }, {
            value: '2499,3563',
            label: 'S'
        }],
        type: 'First Size'
    }, {
        id: [{
            value: '2863,3523',
            label: 34
        }, {
            value: '2866',
            label: 36
        }],
        type: 'Shoe Sizes'
    }, {
        id: [{
            value: '3565',
            label: 'L'
        }, , {
            value: '3567',
            label: 'XL'
        }]
    }, {
        id: [{
            value: '2866',
            label: 37
        }],
        type: 'Shoe Sizes'
    }]

I我试图用下划线来实现这一点,但我只能用一个标签对它进行分组,我需要用任何标签对它进行分组,无论是XS还是36。

I have tried to achieve this with underscore, but I am only able to group it by just one label, and I need to group it by any kind of label, whether it be XS or 36.

我尝试过使用reduce,它已接近但我只需删除值周围的括号,然后将值转换为字符串。

I have tried with reduce below, it is close but I just need to remove the brackets around the value, and turn the value into a string.

EX:价值:'2493,2343'

EX: value: '2493, 2343'

var group_to_values = sizes.reduce(function     (obj, item) {
    obj[item.label] = obj[item.label] || [];
    obj[item.label].push(item.value);
    return obj;
}, {});

var groups = Object.keys(group_to_values).map(function (key) {
    return {label: key, value:    group_to_values[key]};
});

推荐答案

您可以为相同的标签获取哈希表,并迭代外部数组和内部数组。如果找不到标签,它会为结果集生成一个新条目。

You could take a hash table for same labels and iterate the outer array and the inner array. If a label is not found, it generates a new entry for the result set.

var sizes = [{ id: [{ value: '2496', label: 'XS' }, { value: '2499', label: 'S' }], type: 'First Size' }, { id: [{ value: '2863', label: 34 }, { value: '2866', label: 36 }], type: 'Shoe Sizes' }, { id: [{ value: '3561', label: 'XS' }, { value: '3563', label: 'S' }, { value: '3565', label: 'L' }, { value: '3567', label: 'XL' }] }, { id: [{ value: '3523', label: 34 }, { value: '2866', label: 36 }], type: 'Shoe Sizes' }],
    labels = Object.create(null),
    joined = sizes.reduce((r, a) => {
        var temp;
        a.id.forEach(o => {
            if (labels[o.label]) {
                labels[o.label].value += ',' + o.value;
                return;
            }
            if (!temp) {
                temp = Object.assign({}, a, { id: [] });
                r.push(temp);
            }
            temp.id.push(labels[o.label] = o);
        });
        return r;
    }, []);

console.log(joined);

.as-console-wrapper { max-height: 100% !important; top: 0; }

这篇关于如何分组数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆