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