Cómo encontrar el índice que se insertará en la matriz de objetos.
Tengo una matriz de Object.
var cordinate = [ [225, 242], [405, 242], [585, 242], [765, 242], [225, 325], [405, 325], [585, 325], [765, 325], [225, 408], [405, 408], [585, 408], [765, 408] ]Aquí quiero que se inserte el elemento más cercano
matriz que quiero insertar
var extraEle = [404, 260]Cómo determinar el índice exacto para el extraEle en cordinate.
Esto es lo que estoy tratando
Estoy comparando y cordinate para obtener el rango más cercano y luego comparo x cordinate con solo y range para obtener el índice.
var yValue = []; var diffVal = cordinate[0][1]; for(var i=0; i<cordinate.length;i++){ if (Math.abs(extraEle[1] - diffVal) > Math.abs(extraEle[1]- cordinate[i][1])){ diffVal = componentsPos[i][1]; } } var index; yvalue = []; for(var i=0; i<cordinate.length;i++){ if (cordinate[i][1] === diffVal){ yvalue.push(componentsPos[i]); } } var diffValX = yvalue[0][0]; for(var i=0; i<yvalue.length;i++){ if (Math.abs(extraEle[0] - diffValX) > Math.abs(extraEle[0]- yvalue[i][0])){ diffValX = yvalue[i][0]; } } var indexValue = [diffValX,diffVal] cordinate.indexOf(indexValue, 0)¿Podemos tener algo incorporado o mejor enfoque que esto? Nota: este código es un código de trabajo.
La salida en mi caso será 2 porque 260 ( Y ) estará en el rango de los primeros 4 elementos y 404 ( X ) vendrá antes del tercer elemento.
Después de agregar mi cordinado debería ser como.
cordinate = [ [225, 242], [405, 242], [404, 260], [585, 242], [765, 242], [225, 325], [405, 325], [585, 325], [765, 325], [225, 408], [405, 408], [585, 408], [765, 408] ]Pero precisamente necesito solo el índice donde puedo insertar.
Puede que esta no sea la solución más elegante, pero determinará la coordenada más cercana, calculando la distancia entre los puntos y determinando el más cercano, luego puede splice en la matriz.
// Input coordinates let coordinates = [ [225, 242], [405, 242], [585, 242], [765, 242], [225, 325], [405, 325], [585, 325], [765, 325], [225, 408], [405, 408], [585, 408], [765, 408] ]; // Add this to the array let extraEle = [404, 260]; getClosestIndex(coordinates, extraEle).then((result) => { coordinates.splice(result, 0, extraEle); console.log(coordinates); // Output /*[ [225, 242], [405, 242], [404, 260] [585, 242], [765, 242], [225, 325], [405, 325], [585, 325], [765, 325], [225, 408], [405, 408], [585, 408], [765, 408] ]; */ }); function getClosestIndex(coords, targetCoords) { return new Promise((resolve, reject) => { let shortestDist = 999999999; let shortestIndex = 0; coords.forEach((coord, index) => { let dist = Math.sqrt( Math.pow((coord[0]-targetCoords[0]), 2) + Math.pow((coord[1]-targetCoords[1]), 2)); if (dist < shortestDist) { shortestDist = dist; shortestIndex = index; } }); // To add it after the closest element if (shortestIndex < coords.length - 1) shortestIndex += 1; resolve(shortestIndex); }); }La lógica según entiendo es:
Encuentre los subconjuntos que tienen el valor más cercano de y y luego X con mayor precisión. Nota: el ejemplo de salida deseada de OP es incorrecto:
[405, 242], [404, 260], [585, 242],...
[404, 260] debe colocarse antes de [405, 242] .
En el siguiente ejemplo:
[[x, (x - 404)],...] and [[y, (y - 260)],...]
Luego, cada subarreglo se ordena por índice 1 y de eso derivamos el más cercano [x, y]
let coords = [[225,242],[405,242],[585,242],[765,242],[225,325],[405,325],[585,325],[765,325],[225,408],[405,408],[585,408],[765,408]]; let add = [404, 260]; const findRange = (array, xy) => { let xArr = []; let yArr = []; for (let sub of array) { xArr.push([sub[0], Math.abs(xy[0] - sub[0])]); yArr.push([sub[1], Math.abs(xy[1] - sub[1])]); } let xRng = xArr.sort((a, b) => a[1] - b[1]); let yRng = yArr.sort((a, b) => a[1] - b[1]); let X = xRng[0][0]; let Y = yRng[0][0]; let closest = [X, Y]; let idx = array.flatMap((s, i) => closest[0] === s[0] && closest[1] === s[1] ? i : []); if (X >= xy[0]) { array.splice(idx, 0, xy); } else { array.splice(idx+1, 0, xy); } return array; }; console.log(findRange(coords, add));Aquí hay una solución divertida.
Dada una función simple que encuentra el valor más cercano en una matriz, encuentre el valor Y más cercano. Luego, todo lo que tiene que hacer es agregar la nueva coordenada a la matriz y ordenar por columna Y y luego X. Al ordenar la nueva coordenada, trate su valor Y como el valor Y más cercano.
let coords = [[225,242],[405,242],[585,242],[765,242],[225,325],[405,325],[585,325],[765,325],[225,408],[405,408],[585,408],[765,408]]; let add = [404, 260]; const closestValue = (array, goal) => array.reduce((prev, curr) => Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev); let nearestY = closestValue(coords.map(c => c[1]), add[1]); coords.push(add); coords.sort(function([a, b], [c, d]) { if(b === add[1]){ b = nearestY; } else if(d === add[1]){ d = nearestY; } return b - d || a - c }); console.log(coords);Creo que el tipo se puede mejorar.