javascript - Lodash cloneDeepWith 省略 undefined

标签 javascript lodash

我写了一个 customozer 函数来省略对象的未定义值 cloneDeepWith .然而,在不可变的返回上,它并没有递归地挖掘。这是我的代码:

import { cloneDeepWith, pickBy, omit } from 'lodash';

const obj = {
  a0: true,
  b0: true,
  c0: undefined,
  obj1: {
    a1: true,
    b1: true,
    c1: undefined
  }
};

cloneDeepWith(obj, value => {
    const objWithUndefinedValue = pickBy(obj, (value) => value === undefined);
    const keysWithUndefinedValue = Object.keys(objWithUndefinedValue);
    return omit(obj, keysWithUndefinedValue);
});

但是它在第一次返回后不会递归。是否可以使用 lodash 库存功能来实现这一点?

最佳答案

据我所知_.cloneDeepWith()定制器有点误导。定制器应该只处理非对象值。如果它处理对象值,它也应该自己继续递归。例如,您可以看到在调用自定义程序时,克隆由 value.cloneNode(true) 处理。 .如您所见,只有 body出现在控制台中。

const { cloneDeepWith, isObject } = _;

function customizer(value) {
  console.log(value);
  if (_.isElement(value)) {
    return value.cloneNode(true);
  }
}
 
var el = _.cloneDeepWith(document.body, customizer);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>


但是,如果您只是自定义非对象值,并返回 undefined对于对象值,它会提示处理它们的方法(记录在 cloneDeep 中),它会迭代所有内容:

const { cloneDeepWith, isObject, isUndefined } = _;

const obj = {
  a0: true,
  b0: true,
  c0: undefined,
  obj1: {
    a1: true,
    b1: true,
    c1: undefined
  }
};

const result = cloneDeepWith(obj, v => {
  console.log(v);
  
  return isObject(v) ? undefined : 'custom value';
});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>


要解决您的问题,您可以使用_.transform()递归地取所有不是 undefined 的值:

const { transform, isObject, isUndefined } = _;

const obj = {
  a0: true,
  b0: true,
  c0: undefined,
  obj1: {
    a1: true,
    b1: true,
    c1: undefined
  }
};

const cloneDeepWithoutUndefined = (obj) =>
  transform(obj, (r, v, k) => {
    if(isUndefined(v)) return;
    r[k] = isObject(v) ? cloneDeepWithoutUndefined(v) : v;
  });
  
const result = cloneDeepWithoutUndefined(obj);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

关于javascript - Lodash cloneDeepWith 省略 undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52955635/

相关文章:

javascript - JavaScript 中的快速 nextafter 函数

JavaScript 弹出 Chrome 'save as' - 已停用?为什么?

Javascript 我应该使用哪些其他技巧来代替导出符号

underscore.js - lodash 使用值数组的过滤器集合

javascript - lodash如何测试该对象被分配

javascript - 如何使用 lodash 将对象转换为数组

javascript - 从 Controller 切换类并以 Angular 更新 View

javascript - 在 sessionStorage 中保存 Javascript 对象

javascript - 去抖不触发功能

javascript - 使用 lodash 将一个字符串转换为另一个字符串