Похоже, что используемая вами библиотека вызывает метод andSelf
из библиотеки jQuery. Этот метод устарел в пользу addBack
.
Я могу предложить обновить ваши зависимости, чтобы убедиться, что вы используете последние поддерживаемые и совместимые версии библиотек.
Если это не работает, вы можете:
andSelf
с addBack
. Патч обезьяны jQuery - объявите новую функцию в вашем объекте jQuery, которая делегирует существующий метод addBack
. Для этого вы должны создать функцию до того, как owl-carousel попытается ее вызвать. Вы можете выполнить это в своем файле app.module.ts
или в любом другом месте, которое будет проанализировано раньше, чем owl-carousel.
$.fn.andSelf = function() {
return this.addBack.apply(this, arguments);
}
Более поздний фрагмент был найден в этом выпуске github , но, как предполагается, был решен, поэтому я предлагаю дважды проверить ваши версии зависимостей.
У меня был тот же вопрос при записи программы для смешивания (частично накладывающийся) аудиосэмплы.
То, что я сделал, было, добавляют, "запускают событие" и "событие остановки" (для каждого объекта) к списку, сортируют список по моменту времени и затем обрабатывают его в порядке. Вы могли сделать то же, кроме использования целочисленной точки вместо времени, и вместо того, чтобы смешать звуки, Вы будете добавлять символы к набору, соответствующему диапазону. Генерировали ли Вы пустые диапазоны или просто опустили бы их, будет дополнительным.
Edit
Возможно, некоторый код...
# input = list of (start, stop, symbol) tuples
points = [] # list of (offset, plus/minus, symbol) tuples
for start,stop,symbol in input:
points.append((start,'+',symbol))
points.append((stop,'-',symbol))
points.sort()
ranges = [] # output list of (start, stop, symbol_set) tuples
current_set = set()
last_start = None
for offset,pm,symbol in points:
if pm == '+':
if last_start is not None:
#TODO avoid outputting empty or trivial ranges
ranges.append((last_start,offset-1,current_set))
current_set.add(symbol)
last_start = offset
elif pm == '-':
# Getting a minus without a last_start is unpossible here, so not handled
ranges.append((last_start,offset-1,current_set))
current_set.remove(symbol)
last_start = offset
# Finish off
if last_start is not None:
ranges.append((last_start,offset-1,current_set))
Полностью непротестированный, очевидно.
Я сказал бы, создают список конечных точек и сортируют его, также индексируют список диапазонов начальными и конечными точками. Затем выполните итерации через список отсортированных конечных точек, и для каждого, проверьте диапазоны для наблюдения, которые запускают/останавливают в той точке.
Это, вероятно, лучше представлено в коде..., если Ваши диапазоны представлены кортежами:
ranges = [(0,100,'a'),(0,75,'b'),(95,150,'c'),(120,130,'d')]
endpoints = sorted(list(set([r[0] for r in ranges] + [r[1] for r in ranges])))
start = {}
end = {}
for e in endpoints:
start[e] = set()
end[e] = set()
for r in ranges:
start[r[0]].add(r[2])
end[r[1]].add(r[2])
current_ranges = set()
for e1, e2 in zip(endpoints[:-1], endpoints[1:]):
current_ranges.difference_update(end[e1])
current_ranges.update(start[e1])
print '%d - %d: %s' % (e1, e2, ','.join(current_ranges))
Хотя смотря на это ретроспективно, я был бы удивлен, не было ли более эффективного (или по крайней мере чище выглядящего) способ сделать это.
То, что Вы описываете, является примером теории множеств. Для общего алгоритма для вычислительных объединений видят пересечения и различия наборов:
www.gvu.gatech.edu/~jarek/graphics/papers/04PolygonBooleansMargalit.pdf
В то время как бумага предназначена для графики, это применимо к общей теории множеств также. Не точно материал легкого чтения.
Псевдокод:
unusedRanges = [ (each of your ranges) ]
rangesInUse = []
usedRanges = []
beginningBoundary = nil
boundaries = [ list of all your ranges' start and end values, sorted ]
resultRanges = []
for (boundary in boundaries) {
rangesStarting = []
rangesEnding = []
// determine which ranges begin at this boundary
for (range in unusedRanges) {
if (range.begin == boundary) {
rangesStarting.add(range)
}
}
// if there are any new ones, start a new range
if (rangesStarting isn't empty) {
if (beginningBoundary isn't nil) {
// add the range we just passed
resultRanges.add(beginningBoundary, boundary - 1, [collected values from rangesInUse])
}
// note that we are starting a new range
beginningBoundary = boundary
for (range in rangesStarting) {
rangesInUse.add(range)
unusedRanges.remove(range)
}
}
// determine which ranges end at this boundary
for (range in rangesInUse) {
if (range.end == boundary) {
rangesEnding.add(range)
}
}
// if any boundaries are ending, stop the range
if (rangesEnding isn't empty) {
// add the range up to this boundary
resultRanges.add(beginningBoundary, boundary, [collected values from rangesInUse]
for (range in rangesEnding) {
usedRanges.add(range)
rangesInUse.remove(range)
}
if (rangesInUse isn't empty) {
// some ranges didn't end; note that we are starting a new range
beginningBoundary = boundary + 1
}
else {
beginningBoundary = nil
}
}
}
Модульный тест:
В конце resultRanges должен иметь результаты, которые Вы ищете, unusedRanges, и rangesInUse должен быть пустым, beginningBoundary должен быть нолем, и usedRanges должен содержать то, что unusedRanges раньше содержал (но отсортированный по range.end).