【问题标题】:How to group array如何对数组进行分组
【发布时间】:2018-12-06 10:49:33
【问题描述】:

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

目前,这是我收到的 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,它很接近,但我只需要删除值周围的括号,然后将值转换为字符串。

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

【问题讨论】:

  • 实际上有什么区别?那么无类型类型呢?
  • 不同之处在于我试图达到的结果有两个XS的值,这是分组的。
  • @anon 你试过了吗?向我们展示您的代码。
  • @Ivan 我已经编辑并做了我尝试过的事情,但只是试图删除值周围的括号
  • 为什么想要的结果有四个对象?

标签: javascript arrays sorting object


【解决方案1】:

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

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; }

【讨论】:

    【解决方案2】:

    在这里,下面的代码将输出名为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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2020-11-23
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      相关资源
      最近更新 更多