【问题标题】:How could I tweak this code so it will only return null, undefined or empty values我如何调整这段代码,使它只返回空值、未定义值或空值
【发布时间】:2018-12-03 14:40:11
【问题描述】:

对 nodeJS 完全陌生,所以请多多包涵。

我需要一些关于我正在尝试创建的功能的帮助,基本上我正在尝试使用过滤器从对象中返回所有空、null 或未定义的值,但不知道如何去做。

这是我在网上找到的一些代码,它显示了如何删除空值,但我希望它显示所有为空、未定义或空的值(这将包括键和值),而不是删除。

代码如下:

const myObj = { 
  a: 1,
  b:'foo',
  c: '',
  d: null,
  e: undefined,
  f: {v: 1, w:'foo', x: '', y: null, z: undefined, m:{a:'asd'}}
  };

const removeEmpty = (obj) => {
  Object.keys(obj).forEach(k =>
    (obj[k] && typeof obj[k] === 'object') && removeEmpty(obj[k]) ||
    (!obj[k] && obj[k] !== undefined)
  );
  return obj;
};

console.log(removeEmpty(myObj));

非常感谢所有帮助。

感谢阅读

【问题讨论】:

    标签: javascript arrays node.js null return


    【解决方案1】:

    不知道你从哪里得到你的 sn-p 代码,但它似乎并没有以任何方式修改对象。下面应该可以工作,评论希望能帮助您理解它。由于对象是通过引用传递的,我们可以递归任何作为对象的属性来处理嵌套情况。

    const myObj = { 
      a: 1,
      b:'foo',
      c: '',
      d: null,
      e: undefined,
      f: {v: 1, w:'foo', x: '', y: null, z: undefined, m:{a:'asd'}}
      };
    
    const removeEmpty = (obj) => {
      Object.keys(obj).forEach(k => {//for each property of the object
        if(obj[k] === null){
          delete obj[k];//special case for null since typeof null returns "object" :-(
        }else if(typeof obj[k] === 'object'){//if the property IS an object
          removeEmpty(obj[k]);//recurse
        }else if(! obj[k]){//if property is falsey (undefined, "", 0)
          delete obj[k];//remove it from the object
        }
      });
      return obj;
    };
    
    console.log(removeEmpty(myObj));

    编辑

    如果你想得到一个只包含空值的对象,你可以这样修改代码:

    const myObj = { 
      a: 1,
      b:'foo',
      c: '',
      d: null,
      e: undefined,
      f: {v: 1, w:'foo', x: '', y: null, z: undefined, m:{a:'asd'}}
      };
    
    const removeNotEmpty = (obj) => {
      Object.keys(obj).forEach(k => {//for each property of the object
        if(typeof obj[k] === 'object' && obj[k] !== null){//if the property IS an object
          removeNotEmpty(obj[k]);//recurse
        }else if(obj[k]){//if property is truthy
          delete obj[k];//remove it from the object
        }
      });
      return obj;
    };
    
    console.log(removeNotEmpty(Object.assign({},myObj)));//make sure to copy the object if you don't want to modify the first (that's what the Object.assign is for)

    【讨论】:

    • 这是一个很好的答案,谢谢它真的帮助我理解。但是,我希望它在日志中显示这些值,而不是删除为空、未定义或空的值,以便我可以看到哪些值为空、空或未定义。我将如何调整您的代码来实现这一目标?提前致谢。
    • 两个很好的答案,而且非常详细。非常感谢先生。
    【解决方案2】:
        for (const key in myObj) if ([null, undefined].includes(myObj[key])) console.log(`myObj[${key}] is ${myObj[key]}`);
    

    这将显示您在该对象中的未定义或空值,这就是您所需要的,对吗?除非我读错了问题。

    【讨论】:

      【解决方案3】:

      我会编写一个函数,它递归地遍历对象的所有值并删除不需要的值。在我们的例子中,我们不需要有效值。

      我已经记住了以下代码

      function deleteValues(myObj) {
         for (let key in myObj) {
            if (myObj[key]) {
              if (typeof myObj[key] == 'object') { 
                deleteValues(myObj[key]);
               } else {
                  delete myObj[key];
               }
            }
          }
       }
      
       deleteValues(myObj);
      

      【讨论】:

      • 除非你解释你的答案以及它是如何更好的功能版本,否则它可能会被否决或删除。您必须提供一些上下文和格式良好的代码。欢迎来到堆栈溢出。感谢您回答问题。
      • 谢谢,将更新代码并提供我的解释。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多