Estoy tratando de crear un objeto en una determinada estructura a partir de los datos que tengo. De:
// example #1 const dataGender = {"male": 30, "female": 70} // example #2 const dataFruits = {"apple": 10, "banana": 20, "strawberry": 200}a:
const resultGender = { "data": [ { "value": 30, "label": { "en": "male"} }, { "value": 70, "label": { "en": "female"} } ] } const resultFruits = { "data": [ { "value": 30, "label": { "en": "apple"} }, { "value": 20, "label": { "en": "banana"} }, { "value": 200, "label": { "en": "strawberry"} } ] } En otras palabras, una función que acepta dataGender y devuelve resultGender , y lo mismo ocurre con dataFruits .
Como se puede ver arriba, la estructura es consistente y los únicos cambios son en los valores bajo las claves "value" y "en" .
Encontré el ramda objOf() de ramda que me acerca:
const R = require("ramda") const buildObject = R.compose( R.objOf("data"), R.map(R.objOf("value")) ); buildObject([30, 70]); // => {"data": [{"value": 30}, {"value": 70}]} Pero todavía me falta cómo construir la parte textual debajo de "en" .
Convierta el objeto en pares de [key, value] y asígnelos a un nuevo objeto usando R.applySpec . Use R.nth para tomar la clave o el valor del par. Use R.objOf para anidar la matriz en data .
const { pipe, toPairs, map, applySpec, nth, objOf } = R const fn = pipe( toPairs, map(applySpec({ value: nth(1), label: { en: nth(0) } })), objOf('data') ) // example #1 const dataGender = {"male": 30, "female": 70} // example #2 const dataFruits = {"apple": 10, "banana": 20, "strawberry": 200} console.log(fn(dataGender)) console.log(fn(dataFruits)) .as-console-wrapper {max-height: 100% !important; top: 0} <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js" integrity="sha512-t0vPcE8ynwIFovsylwUuLPIbdhDj6fav2prN9fEu/VYBupsmrmk9x43Hvnt+Mgn2h5YPSJOk7PMo9zIeGedD1A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> El comportamiento principal es tomar un objeto, convertirlo en pares y luego aplicar una especificación a cada par. Podemos extraer esto a una función ( mapSpec ), y luego construir una función específica con ella:
const { curry, map, toPairs, applySpec, pipe, nth, objOf } = R const mapSpec = curry((spec, obj) => map( applySpec(spec), toPairs(obj) )) const fn = pipe( mapSpec({ value: nth(1), label: { en: nth(0) } }), objOf('data') ) // example #1 const dataGender = {"male": 30, "female": 70} // example #2 const dataFruits = {"apple": 10, "banana": 20, "strawberry": 200} console.log(fn(dataGender)) console.log(fn(dataFruits)) .as-console-wrapper {max-height: 100% !important; top: 0} <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js" integrity="sha512-t0vPcE8ynwIFovsylwUuLPIbdhDj6fav2prN9fEu/VYBupsmrmk9x43Hvnt+Mgn2h5YPSJOk7PMo9zIeGedD1A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>