Soy bastante nuevo en JS y ramda.js. Digamos que tengo un objeto que consiste en objetos vacíos como este:

obj = { 1: { }, 2: { }, 3: { } }

Y matriz compuesta por las teclas elegidas de obj.

arr = ['1', '2']

Lo que necesito es crear un cierto par clave-valor, por ejemplo a: 'value', dentro de los objetos clave elegidos a través de arr, para que el resultado se vea así:

obj = { 
 1: { a: 'value' }, 
 2: { }, 
 3: { a: 'value' } 
}

He intentado .map a través de las teclas con

arr.map(key => assocPath([key, 'a'], 'value', obj) )

, y también probé con arr.forEach(), pero no funciona y creo que me pueden faltar algunos conocimientos básicos. ¿O hay una función alternativa de ramda.js que debería usar?

0
Nanobrain91 29 oct. 2019 a las 16:26

3 respuestas

La mejor respuesta

Mira mi solución

const object = { 1: { }, 2: { }, 3: { } }
const array = ['1', '3']

function magic(obj, arr) {
  return arr.reduce((acc, key) => ({
    ...acc,
    [key]: { a: 'value' },
  }), obj)
}

console.log(magic(object, array))

Esto también se puede lograr con las funciones de ramda

const object = { 1: { }, 2: { }, 3: { } }
const array = ['1', '3']

const magicR = R.reduce((acc, key) => R.assocPath([ key, 'a' ], 'value', acc))

console.log(magicR(object, array))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
1
lankovova 29 oct. 2019 a las 13:39

Los métodos Ramda son inmutables: no mutan el objeto original, sino que devuelven uno nuevo. El método R.assocPath no es diferente a este respecto. Para actualizar el objeto, deberá iterar la matriz con R.reduce, usar R.assocPath, obtener un nuevo objeto, etc.

const { reduce, assocPath } = R

const fn = reduce((o, key) => assocPath([key, 'a'], 'value', o))

const obj = { 1: { }, 2: { }, 3: { } }
const arr = ['1', '2']

const result = fn(obj)(arr)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
1
Ori Drori 29 oct. 2019 a las 13:39

Debería poder hacer esto con .forEach():

arr.forEach(key => obj[key] = { a: 'value' });

La función .map() es para crear una nueva matriz a partir de los elementos de una matriz fuente, y no es necesario que lo haga.

1
Pointy 29 oct. 2019 a las 13:29