我对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函数?
您应该可以通过.forEach()
执行此操作:
arr.forEach(key => obj[key] = { a: 'value' });
.map()
函数用于从源数组的元素创建新数组,而您不需要这样做。
看看我的解决方案
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>
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>