代码之家  ›  专栏  ›  技术社区  ›  Archimedes Trajano

Ramda:如何递归删除具有空值、空数组和空列表的对象中的键?[副本]

  •  0
  • Archimedes Trajano  · 技术社区  · 3 年前

    Ramda: How to remove keys in objects with empty values? 但我正在寻找一种递归工作的方法。这样我就可以绕过AJV和JSON模式的“特性”,其中 null !== undefined

    我从这个开始。。。这是为了移除空值,但不会递归工作

    import R from 'ramda';
    describe('filter null values', () => {
      it('should filter out null values', () => {
        const specimen = {
          tasks: [
            { id: 'foo', blank: '', zero: 0, nool: null },
            { nool: null },
            { id: '', blank: null, zero: 0, nool: null },
          ],
          useless: { nool: null },
          uselessArray: [{ nool: null }],
          nool: null,
        };
        const expectation = {
          tasks: [
            { id: 'foo', blank: '', zero: 0 },
            { id: '', zero: 0 },
          ],
        };
        const removeNulls = R.reject(R.equals(null));
        expect(removeNulls(specimen)).toEqual(expectation);
      });
    });
    
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   Ori Drori    3 年前

    映射传递的项。如果值是对象(或数组),则递归调用 removeNulls 在当前值上。映射值后,拒绝所有 undefined , null R.isEmpty

    const { pipe, map, when, is, reject, ifElse, F, either, isEmpty, isNil } = R;
    
    const removeNulls = pipe(
      map(when(is(Object), v => removeNulls(v))),
      reject(ifElse(is(String), F, either(isEmpty, isNil))),
    );
    
    const specimen = {"tasks":[{"id":"foo","blank":"","zero":0,"nool":null},{"nool":null},{"id":"","blank":null,"zero":0,"nool":null}],"useless":{"nool":null},"uselessArray":[{"nool":null}],"nool":null};
    
    const result = removeNulls(specimen);
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>