首页 > 解决方案 > 如何对数组进行分组

问题描述

我正在尝试将具有相同标签的相似对象分组。

目前,这是我收到的 JSON。

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'
    }]

我尝试使用下划线来实现这一点,但我只能按一个标签对其进行分组,并且我需要按任何类型的标签对其进行分组,无论是 XS 还是 36。

我在下面尝试了 reduce,它很接近,但我只需要删除值周围的括号,然后将值转换为字符串。

例如:值:'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]};
});

在此处输入图像描述

标签: javascriptarrayssortingobject

解决方案


在这里,下面的代码将输出 Array called result,这是您想要的数据集,循环很清楚,所以我认为您通过它不会有问题:

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'
    }]

var groupedSizes = {};
for (var current, i=0;i < sizes.length ;i++){
  for (var j=0;j < sizes[i]['id'].length;j++) {
    current = sizes[i]['id'][j]
    if (groupedSizes[current['label']] !== undefined) {
      groupedSizes[current['label']].push(current['value'])
    } else {
      groupedSizes[current['label']] = [current['value']]
    }
  }
}
var result = []
for (var key in groupedSizes) {
    result.push({'id': groupedSizes[key].join(','), 'label': key})
}

console.log(result)


推荐阅读