@dbewedb

Как сгруппировать массив объектов по массиву свойств этих объектов?

Имеется структура данных. У каждого объекта в массиве есть массив свойств
arr = [
    {title: 'test 1', props: [4,5]},
    {title: 'test 3', props: [2,4]},
    {title: 'test 2', props: [1,2,5]},
];

после группировки нужно получить
{
    5: [
        {title: 'test 1', props: [4,5]},
        {title: 'test 2', props: [1,2,5]},
    ],
    2: [
        {title: 'test 3', props: [2,4]},
    ]
}

то есть таким образом, что бы в каждой группе было максимальное вхождение по одному из начений в props.

Если изменить начальную стуктуру
arr.push({title: 'test 4', props: [1,4]})
То результат должен стать таким:
{
    4: [
        {title: 'test 1', props: [4,5]},
        {title: 'test 4', props: [1,4]},
        {title: 'test 3', props: [2,4]},
    ],
    1: [
        {title: 'test 2', props: [1,2,5]},
    ]
}


UPD
Если не абстрактно, то в массиве автозапчасти, в props id магазинов, где товар в наличии. Вопрос: в каком магазине наибольший ассортимент?

UPD 2
Если совсем не обстрактно, то в массиве заказ на автозапчасти, нужно сгрупировать их по магазинам без дублирования и отправить курьера забирать, учитываю, что он может это сделать в два этапа, сначала большую часть, потом остальное
  • Вопрос задан
  • 135 просмотров
Пригласить эксперта
Ответы на вопрос 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
Перебрать все объекты и все props в каждом – цикл в цикле.
В новый объект-словарь вставлять массивы по ключу из props, в массив вкладываьт текущий исходный объект.

const arr = [
    {title: 'test 1', props: [4,5]},
    {title: 'test 3', props: [2,4]},
    {title: 'test 2', props: [1,2,5]},
];
  
const props = {};
for (let i = 0; i < arr.length; i++) {
  let obj = arr[i];
  for (let j = 0; j < obj.props.length; j++) {
    let p = obj.props[j];
    if (!props.hasOwnProperty(p)) props[p] = [];
    props[p].push(obj);
  }
}
  
/*  props :
{
	"1": [{
		"title": "test 2",
		"props": [1, 2, 5]
	}],
	"2": [{
		"title": "test 3",
		"props": [2, 4]
	}, {
		"title": "test 2",
		"props": [1, 2, 5]
	}],
	"4": [{
		"title": "test 1",
		"props": [4, 5]
	}, {
		"title": "test 3",
		"props": [2, 4]
	}],
	"5": [{
		"title": "test 1",
		"props": [4, 5]
	}, {
		"title": "test 2",
		"props": [1, 2, 5]
	}]
}
*/
Ответ написан
@dbewedb Автор вопроса
Сергей Соколов Alex спасибо за участие и советы. Мое решение на coffescript
list = [
    warehouses: [1]
,
    warehouses: [2]
,
    warehouses: [3]
,
    warehouses: [4, 1]
,
    warehouses: [5, 2]
,
    warehouses: [6, 3, 2]
]

#получаем массив id магазинов отсортированный по частоте
counted = list
    .reduce (acc, {warehouses}) ->
        for w in warehouses
            acc[w] = {warehouse: w, data: []} unless acc[w]
            acc[w].data.push w
        acc
     , []
     .sort (a, b) -> b.data.length - a.data.length
     .map (i) -> i.warehouse
     .filter (i) -> i > 0

_r = []

for w in counted
     _r[w] = {warehouse: w, data: []} unless _r[w]
     for i in list
         if i.warehouses.includes w
             _r[w].data.push i
             delete list[i]

result = _r
    .sort (a, b) -> b.data.length - a.data.length
    .filter (i) -> i isnt null

console.log 'r', result
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы