JSFiddle - React, Tailwind, and code Playground
by dpnminh
JavaScript
var arrT = [1,2,2,4,4,4,4,4,4,4,5,5,5,8,8,8,8,8,8,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,11,12,3,13,
14, 14, 14,14,14,14,14,15,15,15,15,15,15, 19,19,19,19,19,19,20];
function uniqueIndex(start, end, arr, map){
if (start === end){
return;
}
var startValue = arr[start], endValue = arr[end];
initUniqueStartObj(startValue, map, start, arr[start - 1]);
initUniqueEndObj(endValue, map, end, arr[end - 1], arr.length);
if (endValue === startValue){
if (end === arr.length - 1 || arr[end + 1] !== startValue){
setMapObj(startValue, map, end, 'to');
if (end + 1 < arr.length){
setMapObj(arr[end + 1], map, end + 1, 'from');
}
return;
}
}
else {
if ((start === end - 1) && arr[start - 1] === startValue) {
setMapObj(startValue, map, start, 'to');
}
}
var middle = Math.floor((start + end) / 2);
var middleValue = arr[middle], nextValue = arr[middle + 1];
if (middleValue !== nextValue){
setMapObj(middleValue, map, middle, 'to');
}
uniqueIndex(start, middle, arr, map);
uniqueIndex(middle + 1, end, arr, map);
}
function initUniqueStartObj(key, obj, value, toComparekey){
if ((value > 0 && toComparekey !== key) || value === 0){
setMapObj(key, obj, value, 'from');
}
}
function initUniqueEndObj(key, obj, end, toCompareKey, arrLength){
if (end > 0 && toCompareKey !== key){
setMapObj(key, obj, end, 'from');
if (end === arrLength - 1){
setMapObj(key, obj, end, 'to');
}
}
}
function setMapObj(key, obj, value, prop){
if (!obj[key]){
obj[key] = {};
}
obj[key][prop] = value;
}
function loopThrough(arr, map){
for (var i = 0; i < arr.length; i++){
var item = arr[i];
if (!map[item]){
map[item] = {
from: i
};
}
if ((i + 1 < arr.length && arr[i + 1] !== item) || i + 1 === arr.length){
map[item].to = i
...