data1 = [-1, -1, -1, 10, 12, 14, 16, -1, -1, -1, 20, 33, 44, -1, -1, 123, 11, 903, -1, -1];
resultData1 = reverseData(data1, -1);
debugger;
data2 = [null, null, null, 10, 12, 14, 16, null, null, null, 20, 33, 44, null, null, 123, 11, 903, null, null];
resultData2 = reverseData(data2, null);
debugger;
function reverseData(srcData, nullValue) {
let resultData = new Array(srcData.length);
let i = 0;
while (i < srcData.length) {
if (srcData[i] === nullValue) {
let startData = null;
let endData = null;
if (i !== 0) {
startData = srcData[i - 1];
}
let j = i + 1;
for (; j < srcData.length; j++) {
if (srcData[j] !== nullValue) {
endData = srcData[j];
break;
}
}
if (startData == null && endData == null) {
break;
} else if (startData != null && endData == null) {
resultData[i - 1] = startData;
for (; i < srcData.length; i++) {
resultData[i] = startData;
}
} else if (startData == null && endData != null) {
for (; i <= j; i++) {
resultData[i] = endData;
}
} else {
resultData[i - 1] = startData;
let step = (endData - startData) / (j - i + 1);
let step_i = 1
while (i < j) {
resultData[i] = Math.floor(startData + step * step_i);
i++
step_i++;
}
resultData[i] = endData;
i++;
}
} else {
resultData[i] = null;
i++;
}
}
if (nullValue != null) {
i = 0;
while (i < srcData.length) {
if (srcData[i] === nullValue) {
srcData[i] = null;
}
i++;
}
}
return resultData;
}