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

时间:2017-11-10 14:32:27

标签: typescript

考虑这个对象:

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

有没有办法在没有迭代的情况下获得以下对象?:

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

2 个答案:

答案 0 :(得分:3)

没有迭代就不可能做到。从外部函数的角度来看,您的对象只是一组任意的键值对。

那就是说,你可以在一行代码中使用像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

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

答案 1 :(得分:0)

另一个迭代示例。

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; }, {})