Teniendo la siguiente matriz:
const vegsAndFruits = [ { "fruit_banana": 10, "fruit_apple": 1, "veg_tomato": 3, "fruit_watermelon": 11 }, { "veg_carrot": 3, "veg_garlic": 11, "veg_potato": 0, "fruit_apricot": 22 }, { "veg_eggplant": 2, "veg_cabbage": 1, "fruit_strawberry": 100, "fruit_orange": 30 } ] Quiero filtrarlo para devolver la misma matriz pero para mantener solo las propiedades que comienzan con "fruit" .
Rendimiento esperado
const expectedOutput = [ { "fruit_banana": 10, "fruit_apple": 1, "fruit_watermelon": 11 }, { "fruit_apricot": 22 }, { "fruit_strawberry": 100, "fruit_orange": 30 } ]Mi intento
Pensé que la solución debería provenir de mezclar R.startsWith() y R.pickBy() de ramda. Pero lo siguiente no funciona como esperaba:
const R = require("ramda") R.map(R.pickBy(R.startsWith(["fruit"])),vegsAndFruits)que regresa
// [ {}, {}, {} ]¿Que me estoy perdiendo aqui?
El predicado R.pickBy se llama con los parámetros value (primero) y key (segundo). Como necesita la key , use R.nthArg para crear una función que devuelva el segundo parámetro:
const { map, pickBy, pipe, nthArg, startsWith } = R const fn = map(pickBy(pipe( nthArg(1), startsWith('fruit') ))) const vegsAndFruits = [{"fruit_banana":10,"fruit_apple":1,"veg_tomato":3,"fruit_watermelon":11},{"veg_carrot":3,"veg_garlic":11,"veg_potato":0,"fruit_apricot":22},{"veg_eggplant":2,"veg_cabbage":1,"fruit_strawberry":100,"fruit_orange":30}] const result = fn(vegsAndFruits) console.log(result) <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>La función pickby toma dos parámetros, valor y clave.
Puede ejecutar R.map(R.pickBy((_, key) => key.startsWith('fruit')),vegsAndFruits) para obtener el resultado que desea.