Tengo un objeto que contiene un número indefinido de objetos secundarios que están asociados por valores numéricos como claves de objeto. Lo que necesito es una forma de pasar un número numérico (moneda) y obtener el objeto secundario más cercano al número que paso a la función.
Ejemplo de estructura de objeto
{ "32.5": [ { "key": "value", "key": "value" }, { "key": "value", "key": "value" } ], "34": [ { "key": "value", "key": "value" } ], "35.5": [ { "key": "value", "key": "value" } ] }Las claves del objeto son cadenas, por lo que ya descubrí que probablemente de alguna manera tenga que analizar las claves del objeto en un número para comparar, pero estoy completamente perdido sobre cómo unirlo todo.
Declaré una función que toma 3 parámetros que al final deberían devolver el objeto secundario donde su clave es la más cercana a mi parámetro de entrada.
function getNearest(obj, decimalNumber, below_or_above)cuando pongo "arriba" quiero obtener la clave más cercana donde su valor numérico es el siguiente más alto, cuando pongo "abajo" devolverá el siguiente objeto donde su número clave es el siguiente más pequeño.
Si llamara a getNearest(obj, 33.4, arriba) debería devolver el objeto con la clave "34".
Espero haber logrado explicar de alguna manera para que todos puedan entender..
Este es el punto de partida que se me ocurrió, pero no sé cómo proceder desde aquí.
function getNearest(obj, decimalNumber, above_or_below){ const keys = []; Object.keys(obj).forEach(key =>{ let numericKey = Number(key); keys.push(numericKey); }) //store all numeric keys in array to further process later on }Tú podrías
value below above ------- ------- ------- 0 undef 32.5 31.4 undef 32.5 32.5 32.5 34 32.8 32.5 34 33.4 32.5 34 34 34 34 35.1 34 35.5 35.5 35.5 35.5 50 35.5 undef isAbove false true const getKey = (object, value, isAbove) => Object .keys(object) .map(Number) .sort((a, b) => a - b) .find((v, i, a) => isAbove ? v >= value : v <= value && (a[i + 1] > value || i + 1 === a.length) ), data = { 32.5: [{}], 34: [{}], 35.5: [{}] }; console.log('below'); console.log(getKey(data, 0)); // 32.3 console.log(getKey(data, 31.4)); // 32.3 console.log(getKey(data, 32.5)); // 32.3 console.log(getKey(data, 32.8)); // 32.3 console.log(getKey(data, 33.4)); // 34 console.log(getKey(data, 34)); // 34 console.log(getKey(data, 35.1)); // 35.5 console.log(getKey(data, 35.5)); // 35.5 console.log(getKey(data, 100)); // 35.5 console.log('above'); console.log(getKey(data, 0, true)); // 32.3 console.log(getKey(data, 31.4, true)); // 32.3 console.log(getKey(data, 32.5, true)); // 32.3 console.log(getKey(data, 32.8, true)); // 32.3 console.log(getKey(data, 33.4, true)); // 34 console.log(getKey(data, 34, true)); // 34 console.log(getKey(data, 35.1, true)); // 35.5 console.log(getKey(data, 35.5, true)); // 35.5 console.log(getKey(data, 100, true)); // 35.5 .as-console-wrapper { max-height: 100% !important; top: 0; }pos usando Array.prototype.find . const data = { 32.5: [{ key: "32.5" }], 34: [{ key: "34" }], 35.5: [{ key: "35.5" }] }, getKey = (obj, target, pos) => Object.entries(obj) .map(([k, v]) => [Number(k), v]) .sort(([a], [b]) => a - b) .find(([k], i, a) => pos === "above" ? k >= target : k <= target && (a[i + 1]?.[0] > target || i === a.length - 1) )?.[1]; console.log(getKey(data, 33, "above")); // [{ key: "34" }] console.log(getKey(data, 33, "below")); // [{ key: "32.5" }] console.log(getKey(data, 37, "above")); // undefined console.log(getKey(data, 30, "below")); // undefinedTabla de referencia:
| objetivo | abajo | arriba |
|---|---|---|
0 | undefined | [{ key: '32.5' }] |
31.4 | undefined | [{ key: '32.5' }] |
32.5 | [{ key: '32.5' }] | [{ key: '34' }] |
32.8 | [{ key: '32.5' }] | [{ key: '34' }] |
33.4 | [{ key: '32.5' }] | [{ key: '34' }] |
34 | [{ key: '34' }] | [{ key: '34' }] |
35.1 | [{ key: '34' }] | [{ key: '35.5' }] |
35.5 | [{ key: '35.5' }] | [{ key: '35.5' }] |
50 | [{ key: '35.5' }] | undefined |