Я не полностью проверил возможные края, но то, что вы ищете, должно быть вокруг этого.
Итак, наши инвесторы;
var investors = [ {id: 1, ds: [1,2]}
, {id: 2, ds: [2,2]}
, {id: 3, ds: [3,3]}
, {id: 4, ds: [3,4]}
, {id: 5, ds: [3,4]}
];
Первоначально я планировал отсортировать инвесторы в зависимости от продолжительности их доступности, но я думаю, что это избыточно с кодом ниже:
Требуется сортировка. Если мы думаем о случае, как у I-1, есть диапазон дат [1,2]
, а у I-2 есть диапазон дат [1,1]
. В случае, если мы не сортируем, I-1 получает дату 1, занимая только дату I-2. Однако, как только мы сортируем инвесторов в порядке возрастания в зависимости от их доступности, все в порядке.
var is = [ {id: 1, ds: [1,2]}
, {id: 2, ds: [1,1]}
, {id: 3, ds: [3,3]}
, {id: 4, ds: [3,4]}
, {id: 5, ds: [3,4]}
],
ds = is.sort((a,b) => (a.ds[1]-a.ds[0]) - (b.ds[1]-b.ds[0]))
.reduce( function(r,o){
var day = Array.from({length: o.ds[1] - o.ds[0] + 1}, (_,i) => o.ds[0] + i)
.filter(d => !r[d])[0];
return day !== void 0 ? (r[day] = "Investor id: " + o.id, r)
: r;
}
, {}
);
console.log(ds);
.as-console-wrapper {
max-height: 100% !important
}
Примечания:
ds
в investors
определяют диапазон. Таким образом, [1,3]
будет означать, [1,2,3]
day
дает первый доступный день, если таковой имеется, или будет undefined
day !== void 0
проверок против undefined
, так что этот день free. Array.from({length: o.ds[1] - o.ds[0] + 1}, (_,i) => o.ds[0] + i)
part создает список из диапазона. Например, [2,5]
даст [2,3,4,5]
. В этом случае 5 - 2 + 1 = 4 - длина диапазона, и мы начинаем заполнять его начальным индексом 0
+ o.ds[0]
, который равен 2. - Когда у нас есть даты, мы проверяем их один за другим против каландра, который является
r
аргументом в reduce
обратном вызове, чтобы увидеть, доступны ли они, я имею в виду undefined
. Это .filter(d => !r[d])
часть. - Так что
day
назначается с первой доступной датой или, если ее нет, становится undefined
. ([][0]
case) - Часть
return
просто заполняет дату с помощью id
инвестора, если дата доступна (day !== undefined
), или возвращает календарь как есть.