Я пытаюсь уменьшить массив объектов путем объединения ключей между ними на основе логики c.
Объяснение
Я бы хотел уменьшить следующие массивы (см. Ниже) по их ключам:
lines
: объединить диапазоны чисел, которые являются общими между ними (например: [1,2] + [3,2] = [1,2,3]) dates
: объединяет даты массивов, связанные с lines
ключи
Все дублирующие массивы и / или ключи должны быть удалены.
Примеры:
Ввод пример A :
const errors = [
{
"lines": [1, 2],
"dates": [["2020-12-12","2020-12-19"], ["2020-12-13","2020-12-25"]]
},
{
"lines": [1, 3],
"dates": [["2020-12-12","2020-12-19"], ["2020-12-15","2020-12-17"]]
},
{
"lines": [2, 3],
"dates": [["2020-12-13","2020-12-25"], ["2020-12-15","2020-12-17"]]
},
{
"lines": [3, 2],
"dates": [["2020-12-15","2020-12-17"], ["2020-12-13","2020-12-25"]]
}
]
Выход пример A :
const expected = [{
lines: [1, 2, 3],
dates: [
["2020-12-12", "2020-12-19"],
["2020-12-13", "2020-12-25"],
["2020-12-05", "2020-12-20"],
["2020-12-15", "2020-12-17"]
]
}];
Вход пример B :
const errors = [
{
lines: [1, 2],
dates: [["2020-12-12", "2020-12-19"], ["2020-12-04", "2020-12-25"]]
},
{
lines: [1, 5],
dates: [["2020-12-12", "2020-12-19"], ["2020-12-05", "2020-12-20"]]
},
{
lines: [2, 5],
dates: [["2020-12-04", "2020-12-25"], ["2020-12-05", "2020-12-20"]]
},
{
lines: [3, 4],
dates: [["2020-10-19", "2020-10-25"], ["2020-10-24", "2020-10-27"]]
},
{
lines: [4, 3],
dates: [["2020-10-24", "2020-10-27"], ["2020-10-19", "2020-10-25"]]
},
{
lines: [5, 2],
dates: [["2020-12-05", "2020-12-20"], ["2020-12-04", "2020-12-25"]]
}
];
Вывод пример B :
const expected = [
{
lines: [1, 2, 5],
dates: [
["2020-12-12", "2020-12-19"],
["2020-12-04", "2020-12-25"],
["2020-12-05", "2020-12-20"]
]
},
{
lines: [3, 4],
dates: [
["2020-10-19", "2020-10-25"],
["2020-10-24", "2020-10-27"]
]
}
];
Я создал песочницу для достижения этой цели: https://codesandbox.io/s/lodash-sandbox-zsr9r
Есть три примера, третий не работает.
Моя текущая реализация:
const sanatizeErrors = errors.reduce((acc, currentError, i) => {
const nextError = errors[i + 1]
const hasOnlySingleError = errors.length === 1
// The following const is not enough "strong" and it doesn't handle all cases
const hasCommonErrorWithNextLine =
nextError && _.includes(nextError.lines, currentError.lines[0])
if (hasOnlySingleError) {
return [{
lines: currentError.lines,
dates: currentError.dates
}]
}
if (hasCommonErrorWithNextLine) {
return [
...acc,
{
lines: _.uniq([
...currentError.lines,
...nextError.lines
]),
dates: _.uniqWith(
[
...currentError.dates,
...nextError.dates
], _.isEqual)
}
]
}
return acc
}, [])
Этот последний массив используется для обработки динамических перекрытий диапазонов дат c.
Любой основной момент ценится =)