如何解决可以更改键和值的深度映射/转换js对象
我已经看到了许多解决方案,可以对对象进行“深度映射”,以更改对象的键或对象的值,但不能同时更改两者。
例如,如果给定以下对象:
const obj = {
this: {
is_not: {
something: "we want to keep"
},is: {
a: {
good_idea: 22
},b: {
bad_idea: 67
},c: [{
meh_idea: 22
}]
}
}
}
基本上,我希望能够使用以下函数签名对其进行转换:
const newObj = deepTransform(obj,iterator)
function iterator (key,value) {
if (key.endsWith("idea")) return { [key.replace("idea","")]: value + 1}
else if (key === "is_not") return {}
else return {[key]: value}
}
运行deepTransform将产生一个类似于以下内容的对象
:{
this: {
is: {
a: {
good: 23
},b: {
bad: 68
},c: [{
meh: 23
}]
}
}
}
如果有人可以帮助我创建此功能,那就太好了!如果它在后台使用lodash函数,我会感到非常高兴。
请询问是否不清楚。谢谢!
解决方法
您可以使用lodash的_.transform()
递归地迭代对象/数组,并使用更新的键和值重建它们:
const { transform,toPairs,isObject } = _
const deepTransform = (obj,iterator) => transform(obj,(acc,val,key) => {
const pair = toPairs(iterator(key,val))[0] // use the iterator and get a pair of key and value
if(!pair) return // if pair is undefined,continue to next iteration
const [k,v] = pair // get the update key and value from the pair
// set the updated key and value,and if the value is an object iterate it as well
acc[k] = isObject(v) ? deepTransform(v,iterator) : v
})
const obj = {"this":{"is_not":{"something":"we want to keep"},"is":{"a":{"good_idea":22},"b":{"bad_idea":67},"c":[{"meh_idea":22}]}}}
const iterator = (key,value) => {
if (String(key).endsWith("_idea")) return { [key.replace("_idea","")]: value + 1}
if (key === "is_not") return {}
return {[key]: value}
}
const newObj = deepTransform(obj,iterator)
console.log(newObj)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>
更改迭代器a以返回一对[key,value],将使_.toPairs()
变得多余,并简化代码:
const { transform,isObject,isUndefined } = _
const deepTransform = (obj,key) => {
const [k,v] = iterator(key,val) // use the iterator and get a pair of key and value
if(isUndefined(k)) return // skip if no updated key
// set the updated key and value,value) => {
if (String(key).endsWith("_idea")) return [key.replace("_idea",""),value + 1]
if (key === "is_not") return []
return [key,value]
}
const newObj = deepTransform(obj,iterator)
console.log(newObj)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。