如何从容器对象中过滤非空对象?

How to filter not null objects from a container object?

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

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

有什么帮助吗?

这都是动态的,你要找的。希望这对您有所帮助!

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);

将 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)

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>

您可以使用 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)