Tengo dos objetos que necesito combinar de alguna manera para lograr el resultado deseado. Aquí hay un ejemplo de juguete.
Digamos que estoy realizando un experimento sobre una nueva dieta para ratones. Reuní 6 ratones y los alimenté con una dieta diferente. Después de varias semanas, pesé todos los ratones y registré el peso de cada uno. Esos pesos se dan en el siguiente objeto:
const postExperimentWeights = { mickey: 20, minnie: 11, jerry: 15, stuart: 33, gonzales: 17, pinky: 50, };Para concluir si alguna de las dietas tuvo éxito, tengo otro objeto de datos, con los pesos objetivo que se considerarían malos , mediocres o buenos , por ratón.
const targetWeights = { mickey: { belowIsBad: 15, aboveIsGood: 22, }, minnie: { belowIsBad: 5, aboveIsGood: 10, }, jerry: { belowIsBad: 16, aboveIsGood: 20, }, stuart: { belowIsBad: 30, aboveIsGood: 40, }, gonzales: { belowIsBad: 10, aboveIsGood: 15, }, pinky: { belowIsBad: 60, aboveIsGood: 100, }, };Y mi resultado deseado son 3 variables, cada una de las cuales contiene una matriz de nombres:
const good = ['minnie', 'gonzales']; // those were above their respective `aboveIsGood` const mediocre = ['mickey', 'stuart']; // were between respective `belowIsBad` & `aboveIsGood` const bad = ['jerry', 'pinky']; // below respective `belowIsBad`¿Existe una manera bastante simple o elegante de lograr el resultado deseado? Por lo general, prefiero utilizar un enfoque funcional, pero independientemente estaría agradecido por cualquier ayuda.
Repetiría los resultados de caducidad usando Object.entries() y simplemente los compararía con los valores objetivo:
const postExperimentWeights = { mickey: 20, minnie: 11, jerry: 15, stuart: 33, gonzales: 17, pinky: 50, }; const targetWeights = { mickey: { belowIsBad: 15, aboveIsGood: 22, }, minnie: { belowIsBad: 5, aboveIsGood: 10, }, jerry: { belowIsBad: 16, aboveIsGood: 20, }, stuart: { belowIsBad: 30, aboveIsGood: 40, }, gonzales: { belowIsBad: 10, aboveIsGood: 15, }, pinky: { belowIsBad: 60, aboveIsGood: 100, }, }; function evaluateResults(input, target) { const good = []; const avg = []; const bad = []; for(const [key,value] of Object.entries(input)) { if(value < target[key].belowIsBad) { bad.push(key); }else if(value > target[key].aboveIsGood) { good.push(key); }else { avg.push(key); } } console.log("good:", good); console.log("avg:", avg); console.log("bad:", bad); } evaluateResults(postExperimentWeights,targetWeights);Otra solución usando reduce usando push en lugar de concat
const postExperimentWeights = {mickey: 20,minnie: 11,jerry: 15,stuart: 33,gonzales: 17,pinky: 50,}; const targetWeights = { mickey: {belowIsBad: 15,aboveIsGood: 22,},minnie: {belowIsBad: 5,aboveIsGood: 10,},jerry: {belowIsBad: 16,aboveIsGood: 20,},stuart: {belowIsBad: 30,aboveIsGood: 40,},gonzales: {belowIsBad: 10,aboveIsGood: 15,},pinky: {belowIsBad: 60,aboveIsGood: 100,},}; let res = Object.entries(postExperimentWeights).reduce((acc, [mouse,weight]) => { if (weight > targetWeights[mouse].aboveIsGood) acc.good.push(mouse) else if (targetWeights[mouse].belowIsBad < weight && weight <targetWeights[mouse].aboveIsGood) acc.mediocre.push(mouse) else if (targetWeights[mouse].belowIsBad > weight) acc.bad.push(mouse) return acc }, {good: [],mediocre: [],bad: []}) console.log(res)Puede usar este fragmento de código en el término más simple
const mices = { mickey: 20, minnie: 11, jerry: 15, stuart: 33, gonzales: 17, pinky: 50 }; const targetWeights = { mickey: { belowIsBad: 15, aboveIsGood: 22 }, minnie: { belowIsBad: 5, aboveIsGood: 10 }, jerry: { belowIsBad: 16, aboveIsGood: 20 }, stuart: { belowIsBad: 30, aboveIsGood: 40 }, gonzales: { belowIsBad: 10, aboveIsGood: 15 }, pinky: { belowIsBad: 60, aboveIsGood: 100 } }; function findTheWeights(main, target) { const good = []; const mediocre = []; const bad = []; for (let mice in main) { const { belowIsBad, aboveIsGood } = target[mice]; main[mice] > aboveIsGood ? good.push(mice) : main[mice] < belowIsBad ? bad.push(mice) : mediocre.push(mice); } return { good, bad, mediocre }; } console.log(findTheWeights(mices, targetWeights));