Если вы ищете функцию, совместимую с потоком, которая может обрабатывать двухмерные массивы с любым типом элемента, вы можете использовать функцию ниже.
const getUniqueCombinations = <T>(items : Array<Array<T>>, prepend : Array<T> = []) : Array<Array<T>> => {
if(!items || items.length === 0) return [prepend];
let out = [];
for(let i = 0; i < items[0].length; i++){
out = [...out, ...getUniqueCombinations(items.slice(1), [...prepend, items[0][i]])];
}
return out;
}
Визуализация операции:
in:
[
[Obj1, Obj2, Obj3],
[Obj4, Obj5],
[Obj6, Obj7]
]
out:
[
[Obj1, Obj4, Obj6 ],
[Obj1, Obj4, Obj7 ],
[Obj1, Obj5, Obj6 ],
[Obj1, Obj5, Obj7 ],
[Obj2, Obj4, Obj6 ],
[Obj2, Obj4, Obj7 ],
[Obj2, Obj5, Obj6 ],
[Obj2, Obj5, Obj7 ],
[Obj3, Obj4, Obj6 ],
[Obj3, Obj4, Obj7 ],
[Obj3, Obj5, Obj6 ],
[Obj3, Obj5, Obj7 ]
]
Это событие dragenter .
ondragstart = e => e.dataTransfer.setData('text', '');
// set the class when entering over #target
target.ondragenter = e => target.classList.add('draghover');
// remove when leaving
target.ondragleave = e => target.classList.remove('draghover');
#target {
width: 250px;
height: 250px;
border: 1px solid;
}
#target.draghover {
background: #CCC;
}
<div draggable="true">drag me over the target</div>
<div id="target"></div>
Да, есть обработчик событий ondrag()
, который срабатывает во время перетаскивания элемента. Если вы хотите вызвать функцию в самом начале действия перетаскивания, есть также обработчик событий ondragstart()
.
Если вы хотите захватить, когда элемент перетаскивается поверх элемента (но не отброшен), есть ondragenter()
, который срабатывает один раз, как элемент перетаскивается в элемент, а также ondragover()
, который срабатывает многократно, когда элемент перетаскивается поверх элемента. 1112]