Tengo una matriz de objetos con índices superpuestos.
[ //1st object { start: 3, end: 10 }, //2nd object { start: 5, end: 8 }, //3rd object { start: 11, end: 30 }, //4th object { start: 0, end: 4 } ]Quiero crear una matriz nueva modificando y eliminando algunos de los objetos superpuestos, es decir, caso 1: eliminar si algún objeto cae completamente en un intervalo, es decir, el segundo objeto puede eliminarse, ya que cae en el primer objeto caso 2: - si algún objeto cae parcialmente dentro del intervalo, quiero actualizar los índices. para que todos los objetos puedan ser diferentes
el resultado final se verá como a continuación.
[ //I increased 1st object by 2 as 4th object's end index is 4. I increased (end of 4th - start of 1st) + 1 { start: 5, end: 12 }, //I removed 2nd object // I changed the 3rd object by 2 because it's overlapping with the newly created `{start:5, end:12}` object { start: 13, end: 32 }, // No change in 4th object. { start: 0, end: 4 } ]Alguna sugerencia de como puedo solucionar este problema. Probé el siguiente enfoque para modificar la matriz.
const updateArray = arr => { let sortArr = arr.sort((a,b)=> a.start - b.start || a.end - b.end); let newArr = sortArr.reduce((r,a) =>{ let obj = r[r.length - 1] || {}; if (obj.start <= a.start && a.start <= obj.end) { if (obj.end < a.end) { a.start = obj.end + 1; } else { obj.start = a.end + 1; } } return r.concat(a); },[]); return newArr; }Supongo que una salida ordenada estaría bien (ya que estaba usando una). Si es así, el siguiente script lo resolverá.
function modifyArray(array) { var prevEnd; array = array.sort((x,y) => x.start - y.start); for(i = 0; i < array.length; i++) { if(!i) { prevEnd = array[i].end; continue; } if(array[i].start < prevEnd && array[i].end > prevEnd) { diff = prevEnd + 1 - array[i].start; array[i].start += diff; array[i].end += diff; prevEnd = array[i].end; } else if(array[i].start > prevEnd) continue; else array.splice(i--, 1); } return array; } function test() { let array1 = [ { start: 3, end: 10 }, { start: 5, end: 8 }, { start: 11, end: 30 }, { start: 0, end: 4 } ]; let array2 = [{start: 10, end: 12}, {start:17, end: 19}] console.log(modifyArray(array1)) console.log(modifyArray(array2)) }