【问题标题】:How to filter not null objects from a container object?如何从容器对象中过滤非空对象?
【发布时间】:2020-06-26 17:25:16
【问题描述】:

我有一个问题,我一般不使用键,但我现在遇到了这个问题,我有一个这样的对象:

let A = {
            'a': null;
            'b': null,
            'c': null,
            'd': { isOk : 'Yes' },
            'e': { isOk : 'No' },
            'f': { label : 'field'}
       }

我想过滤这个对象并抛出空值,我想要这样的结果:

 {
      'd': { isOk : 'Yes' },
      'e': { isOk : 'No' },
      'f': { label : 'field'}
 }

我无法一一验证,因为键是动态的,我不能在对象上使用 map 或 for

我正在尝试将其转换为数组,以便之后可以使用过滤器方法,但没有成功:

console.log(
    pipe(
      toPairs,
      map(
        ([id, props]) => ({
          id,
          ...props,
        }),
        A,
      ),
    ),
  );

有什么帮助吗?

【问题讨论】:

标签: javascript arrays object key ramda.js


【解决方案1】:

将 R.reject() 与 R.equals(null) 或 R.isNil 一起使用(如果您也不关心 undefined 值):

const { reject, equals } = R

const fn = reject(equals(null)) // use R.isNil instead of R.equals if you don't care about undefined values as well

const obj = {"a":null,"b":null,"c":null,"d":{"isOk":"Yes"},"e":{"isOk":"No"},"f":{"label":"field"}}

const result = fn(obj)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>

使用 vanilla JS,您可以使用与 Object.entries() 相同的想法来转换为 [key, value] 对,过滤并删除具有 null 值的对,然后使用 Object.fromEntries() 转换回对象:

const fn = onj => Object.fromEntries(
  Object.entries(obj)
    .filter(([, v]) => v !== null)
)

const obj = {"a":null,"b":null,"c":null,"d":{"isOk":"Yes"},"e":{"isOk":"No"},"f":{"label":"field"}}

const result = fn(obj)

console.log(result)

【讨论】:

  • 是的,但reject (isNil) 更简单。
  • 简单得多:)
【解决方案2】:

这都是动态的,你正在寻找什么。希望这会有所帮助!

let A = {
            'a': null,
            'b': null,
            'c': null,
            'd': { isOk : 'Yes' },
            'e': { isOk : 'No' },
            'f': { label : 'field'}
       };

var res = {};
Object.keys(A).forEach(key => {
    if(A[key]!==null){
        res[key]=A[key];
    }
})

console.log(res);

【讨论】:

    【解决方案3】:

    Ramda 有一个函数 filter 用于按谓词过滤对象或数组,它的对应函数用于仅保留那些 与谓词匹配的元素,reject

    它还有一个谓词isNil 来检查一个值是null 还是undefined

    我们可以把它们放在一起写 reject (isNil) 来获得一个满足你要求的函数:

    let A = {a: null, b: null, c: null, d: {isOk: 'Yes'}, e: {isOk: 'No'}, f: { label : 'field'}}
    
    console .log (reject (isNil) (A))
    <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
    <script> const {reject, isNil } = R                                  </script>

    【讨论】:

      【解决方案4】:

      您可以使用 Object.keys() 方法从对象中获取键数组,然后遍历该对象。

      let A = {
          'a': null,
          'b': null,
          'c': null,
          'd': { isOk: 'Yes' },
          'e': { isOk: 'No' },
          'f': { label: 'field' }
      }
      
      let keysArr = Object.keys(A);
      
      keysArr.map(key => {
          if (A[key] == null)
              delete A[key]
      })
      
      console.log(A)

      【讨论】:

        猜你喜欢
        • 2020-04-07
        • 2022-07-20
        • 2020-07-24
        • 2020-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多