Javascript 递归修剪对象中所有元素的更好方法?
如果我有一个像Javascript 递归修剪对象中所有元素的更好方法?,javascript,object,recursion,lodash,Javascript,Object,Recursion,Lodash,如果我有一个像 const obj = { field: { subfield: { innerObj: { a: ' asdasd asdas . ' }, innerArr: [' s ', ' ssad . '], innerArrObj: [ { b: ' adsad ' } ], } } } 我想出了这样的办法 const trimFields = (
const obj = {
field: {
subfield: {
innerObj: { a: ' asdasd asdas . ' },
innerArr: [' s ', ' ssad . '],
innerArrObj: [ { b: ' adsad ' } ],
}
}
}
我想出了这样的办法
const trimFields = (data) =>
_.mapValues(data, (element, k) =>
_.isArray(element)
? element.map((value) =>
_.isObject(value) ? trimFields(value) : trimText(value)
)
: _.isObject(element)
? trimFields(element)
: trimText(element)
);
但我想知道是否有更好/更有效的方法来做到这一点
我会直接在函数中切换为array/object/other,从而简化递归调用:
const trimFields = (data) =>
_.isArray(data)
? data.map(trimFields)
: _.isObject(data)
? _.mapValues(trimFields)
: trimText(data);
lodash函数迭代对象和数组。您可以使用.transform()
创建递归mapValues()
函数,然后应用transformer函数(.trim()
,在这种情况下)来处理所有值:
const recursiveMapValues=\ curry((fn,obj)=>
_.变换(obj,(acc、值、键)=>{
acc[键]=等分对象(值)?
递归映射值(fn,值)
:
fn(价值)
}))
const trimFields=recursiveMapValues(v=>u.isString(v)?u.trim(v):v)
const obj={“field”:{“subfield”:{“innerObj”:{“a”:“asdasd asdas.”},“innerArr”:[“s”,“ssad.”,3],“innerRobj”:[{“b”:“adsad”}]}}}
常量结果=trimFields(obj)
console.log(结果)
我会编写一个更通用的deepMap
函数,然后用trimText
和您的对象调用它。然后,它变得易于重用,并且将对象导航的处理与实际的字段转换分离开来。不管有没有洛达斯,写作都不难。这里有一个版本:
const deepMap=(fn)=>(obj)=>
数组.isArray(obj)
? 目标地图(深度地图(fn))
:对象(obj)==obj
? Object.fromEntries(Object.entries(obj.map)([k,v])=>[k,deepMap(fn)(v)])
://其他
fn(obj)
const trimText=field=>typeof field==='string'?trim():字段;
const obj={field:{subfield:{innerObj:{a:'asdasd asdas.},innerArr:['s','ssad.],innerRobj:[{b:'adsad'}]}}
控制台日志(
深度地图(trimText)(obj)
)
Hmm,我明白你的意思,但这会返回一个空对象。啊,我以为isObject
会排除数组,但事实并非如此……我遇到了一个类似的问题,然后我回忆说,从技术上讲,一切都是Javascript中的一个对象,尤其是数组,就.isObject
而言。:typeof obj==“object”&&obj
,否则就会出现null
@kaido:Yes,改变了,尽管我更喜欢这个版本:Object(obj)==obj
。