Как сгруппировать массив - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь сгруппировать похожие объекты с одинаковой меткой.

На данный момент это 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]};
});

enter image description here

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вот код, приведенный ниже, выведет Array с именем 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)
0 голосов
/ 27 июня 2018

Вы можете взять хеш-таблицу для тех же самых меток и итерировать внешний массив и внутренний массив. Если метка не найдена, она генерирует новую запись для набора результатов.

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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...