у меня есть 2 сгруппированных массива, у которых есть родительский и дочерний массивы, я хочу объединить эти 2 массива, у которых есть один и тот же родитель, но дочерний элемент, который я копирую, имеет уникальный порядок, я ищу много статей в Интернете, но еще не нашел решение. пожалуйста, помогите мне. есть мой код
var groupOrder = [
{
group_time_str: "25 Apr 2019",
orders: [
{
vertical_id: "1",
vertical_category: "A"
},
{
vertical_id: "2",
vertical_category: "B"
}
]
},
{
group_time_str: "26 Apr 2019",
orders: [
{
vertical_id: "1",
vertical_category: "A"
},
{
vertical_id: "2",
vertical_category: "B"
},
{
vertical_id: "3",
vertical_category: "C"
}
]
}
];
var groupOrder2 = [
{
group_time_str: "26 Apr 2019",
orders: [
{
vertical_id: "3",
vertical_category: "C"
},
{
vertical_id: "4",
vertical_category: "D"
}
]
},
{
group_time_str: "27 Apr 2019",
orders: [
{
vertical_id: "1",
vertical_category: "A"
},
{
vertical_id: "2",
vertical_category: "B"
}
]
}
];
const combine = [...groupOrder, ...groupOrder2];
const groupBy = combine.reduce((acc, cur) => {
acc[cur.group_time_str]
? (acc[cur.group_time_str].orders = [
...acc[cur.group_time_str].orders,
...cur.orders
])
: (acc[cur.group_time_str] = cur);
return acc;
}, {});
console.info(groupBy);
body {
font-family: sans-serif;
}
<h1>Grouped Order</h1>
вы видите, что в группе 26 апреля 2019 года есть дубликат
{
vertical_id: "3",
vertical_category: "C"
},
как я могу удалить дубликат? пожалуйста, помогите мне, спасибо
Вы можете сделать следующую фильтрацию cur.orders, чтобы удалить дубликаты,
var groupOrder = [
{
group_time_str: "25 Apr 2019",
orders: [
{
vertical_id: "1",
vertical_category: "A"
},
{
vertical_id: "2",
vertical_category: "B"
}
]
},
{
group_time_str: "26 Apr 2019",
orders: [
{
vertical_id: "1",
vertical_category: "A"
},
{
vertical_id: "2",
vertical_category: "B"
},
{
vertical_id: "3",
vertical_category: "C"
}
]
}
];
var groupOrder2 = [
{
group_time_str: "26 Apr 2019",
orders: [
{
vertical_id: "3",
vertical_category: "C"
},
{
vertical_id: "4",
vertical_category: "D"
}
]
},
{
group_time_str: "27 Apr 2019",
orders: [
{
vertical_id: "1",
vertical_category: "A"
},
{
vertical_id: "2",
vertical_category: "B"
}
]
}
];
const combine = [...groupOrder, ...groupOrder2];
const groupBy = combine.reduce((acc, cur) => {
acc[cur.group_time_str]
? (acc[cur.group_time_str].orders = [
...acc[cur.group_time_str].orders,
...cur.orders.filter(item => acc[cur.group_time_str].orders.findIndex(accOrder => item['vertical_id'] === accOrder['vertical_id'] && item['vertical_category'] === accOrder['vertical_category']) <= -1)
])
: (acc[cur.group_time_str] = cur);
return acc;
}, {});
console.info(groupBy);
body {
font-family: sans-serif;
}
<h1>Grouped Order</h1>
Это означает, что мы не нашли элемент в массиве.
я пробую это с данными Rest API, процесс очень медленный и занимает больше времени, около 2 минут, когда данных много
Это означает, что текущий элемент уникален, так как мы не нашли его в нашей обработке.
Попробуйте уменьшить первый массив, чтобы получить только те элементы, которые не совпадают, вместо объединения массивов в начале:
const groupOrder = [{group_time_str: "25 Apr 2019",orders: [{vertical_id: "1",vertical_category: "A"},{vertical_id: "2",vertical_category: "B"}]},{group_time_str: "26 Apr 2019",orders: [{vertical_id: "1",vertical_category: "A"},{vertical_id: "2",vertical_category: "B"},{vertical_id: "3",vertical_category: "C"}]}];
const groupOrder2 = [{group_time_str: "26 Apr 2019",orders: [{vertical_id: "3",vertical_category: "C"},{vertical_id: "4",vertical_category: "D"}]},{group_time_str: "27 Apr 2019", orders: [{vertical_id: "1",vertical_category: "A"},{vertical_id: "2",vertical_category: "B"}]}];
const result = groupOrder.reduce((arr, g1) => {
const g2match = groupOrder2.find(
g2 => g2.group_time_str === g1.group_time_str
);
if (g2match) {
const orders = g1.orders.filter(
g1o =>
!g2match.orders.find(
m =>
g1o.vertical_id === m.vertical_id &&
g1o.vertical_category === m.vertical_category
)
);
g2match.orders = [...g2match.orders, ...orders];
return arr;
}
return [...arr, { ...g1 }];
}, []);
console.info([...result, ...groupOrder2]);
что означает <= -1 на фильтре?