使用ramda.js assocPath向多个键分配某个值?

问题描述 投票:0回答:3

我对JS和ramda.js很陌生。假设我有一个由空对象组成的对象,如下所示:

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

和由obj的选定键组成的数组。

arr = ['1', '2']

我需要在通过a: 'value'选择的键对象内部创建一个特定的键-值对,例如arr,因此结果看起来像这样:

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

我已经尝试通过以下方式通过按键映射。

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

,并且也尝试了使用arr.forEach()的方法,但是它不起作用,我相信我可能会缺少一些基本知识?还是我应该使用替代的ramda.js函数?

javascript reactjs ramda.js
3个回答
1
投票

您应该可以通过.forEach()执行此操作:

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

.map()函数用于从源数组的元素创建新数组,而您不需要这样做。


0
投票

看看我的解决方案

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))

这也可以通过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>

0
投票

Ramda方法是不可变的-它们不会改变原始对象,但会返回一个新对象。 R.assocPath方法在这方面没有什么不同。要更新对象,您需要使用R.reduce迭代数组,使用R.assocPath,获取新对象,等等...

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>
© www.soinside.com 2019 - 2024. All rights reserved.