使用 ramda.js assocPath 为多个键分配特定值?
Assign multiple keys a certain value using ramda.js assocPath?
我对 JS 和 ramda.js 很陌生。假设我有一个由这样的空对象组成的对象:
obj = { 1: { }, 2: { }, 3: { } }
和由 obj
的选定键组成的数组。
arr = ['1', '2']
我需要的是在通过 arr
选择的键对象中创建一个特定的键值对,例如 a: 'value'
,因此结果将如下所示:
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 方法是不可变的 - 它们不会改变原始对象,但 return 会改变一个新对象。 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>
我对 JS 和 ramda.js 很陌生。假设我有一个由这样的空对象组成的对象:
obj = { 1: { }, 2: { }, 3: { } }
和由 obj
的选定键组成的数组。
arr = ['1', '2']
我需要的是在通过 arr
选择的键对象中创建一个特定的键值对,例如 a: 'value'
,因此结果将如下所示:
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 方法是不可变的 - 它们不会改变原始对象,但 return 会改变一个新对象。 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>