EDITAR : aquí hay una reformulación de la pregunta para mayor claridad (disculpas por la confusión):
PREGUNTA: dados los límites de una matriz y una matriz punct_arr donde ambos están ordenados, devuelva una matriz de salida de valores índice_de_separación donde índice_de_separación[i] es el valor más cercano en punct_arr a los límites[i]. De ello se deduce que el índice_de_separación tendrá el mismo tamaño que los límites.
Entonces, digamos que tengo dos matrices:
límites = [280, 560]
punct_arr = [5, 99, 151, 159, 255, 352, 462, 502, 519, 531, 556, 602]
Resultado esperado: [255, 556]
El resultado siempre debe tener la misma longitud que la matriz de límites.
Esto es lo que tengo hasta ahora:
for (var limit = 0; limit < limits.length; limit++) { for (var punct = 0; punct < punct_arr.length; punct++) { if (Math.abs(punct_arr[punct - 1] - limits[limit]) < (Math.abs(punct_arr[punct] - limits[limit])) && (Math.abs(punct_arr[punct] - limits[limit]) < (Math.abs(punct_arr[punct] - limits[limit + 1])))) { separation_index.push(punct_arr[punct-1]); } } }¡Gracias por adelantado!
Aquí hay un enfoque descompuesto en el que comenzamos a escribir en un alto nivel y definimos funciones auxiliares auxiliares en el camino:
function closest (limits, inputs) { return limits.map(v => closest1(v, inputs)) } function closest1 (one, many) { return many.reduce((r, v) => delta(r, one) < delta(v, one) ? r : v, -Infinity ) } function delta (a, b) { return Math.abs(a - b) } const limits = [280, 560] const inputs = [5, 99, 151, 159, 255, 352, 462, 502, 519, 531, 556, 602] console.log(closest(limits, inputs)) [ 255, 556 ]Aquí hay una forma. Acabo de ajustar un poco tu código.
const limits = [280, 560] const punct_arr = [5, 99, 151, 159, 255, 352, 462, 502, 519, 531, 556, 602] function closestLimits(limits, arr) { const diff = [] const separation_index = [] let closest for (var limit = 0; limit < limits.length; limit++) { diff.length = 0 for (var punct = 0; punct < arr.length; punct++) { var m = Math.abs(arr[punct] - limits[limit]); diff.push(m) if (m <= Math.min(...diff)) { smallest = arr[punct] } } separation_index.push(smallest); } return separation_index } console.log(closestLimits(limits, punct_arr))