typescript 将任何具有值的对象字段空字符串替换为null而不进行迭代?

cl25kdpy  于 2023-01-14  发布在  TypeScript
关注(0)|答案(3)|浏览(298)

考虑这个对象:

{
    value1: 'bacon',
    value2: '',
    value3: 'lard',
    value4: '',
    value5: 'cheese',
};

有没有办法不经过迭代就得到下面的对象?

{
    value1: 'bacon',
    value2: null,
    value3: 'lard',
    value4: null,
    value5: 'cheese',
};
f0brbegy

f0brbegy1#

没有迭代是不可能的,从外部函数的Angular 来看,对象只是一组任意的键值对。
也就是说,使用像lodash这样的库及其mapValues函数,只需一行代码就可以完成:

_.mapValues(myObj, v => v === '' ? null : v)

或者,您可以在没有外部库的情况下自己完成(此示例会改变原始对象):

Object.keys(myObj).forEach(k => myObj[k] = myObj[k] === '' ? null : myObj[k])

还有另一种方法,你可以使用Proxy对象来完成你的请求,这是一种懒惰的方式,它不会主动改变对象中的值,但是当一个值被请求时,它会检查它是否是空字符串,如果是,则返回null:

const proxyObj = new Proxy(myObj, {
  get: (obj, prop) => obj[prop] === "" ? null : obj[prop],
});

// proxyObj.value1
//   => 'bacon'
// proxyObj.value2
//   => null

这个代理解决方案可能很聪明,但是在大多数情况下,上面的迭代解决方案是更简单、更好的选择。

d7v8vwbk

d7v8vwbk2#

另一个迭代示例。

const obj = {
  value1: 'bacon',
  value2: '',
  value3: 'lard',
  value4: '',
  value5: 'cheese',
};

Object.keys(obj).reduce((acc, key) => {acc[key] = obj[key] === '' ? null : 
obj[key]; return acc; }, {})
r1wp621o

r1wp621o3#

对于任何人谁遇到这个问题,这些解决方案并不完全像他们想要的那样工作,这里是我自己解决它的方法。我使用JSON.stringify + JSON.parse(data,reviver)来翻译字符串。

let data = {
  value1: 'bacon',
  value2: '',
  value3: 'lard',
  value4: '',
  value5: 'cheese',
};

data = JSON.parse(JSON.stringify(data), (key, value) => {
    return value === '' ? null : value;
});

相关问题