有没有办法在 Lodash 或 Underscore 中为 null 指定默认值?

Is there a way to specify default values for null in Lodash or Underscore?

我知道 _.defaults 函数可以为键为 undefined 的对象设置默认值。但是,它不适用于 null 的键。有办法实现吗?

_.defaults 助手的这种行为背后的原因是 undefined 表示 属性 尚未设置,而 null 传达了明确设置的含义什么都不指。

如果您仍然认为您的变量应该包含 null 并用一个函数设置,那么您可以使用 _.defaultTo,一个通常 returns 第一个参数和第二个参数的函数如果第一个是 NaNnullundefined。不过,您需要自己让它遍历所有对象的键。

_.forOwn(myObject, function (value, key) {
  myObject[key] = _.defaultTo(value, defaultValues[key]);
});

但是,这不会为甚至未在原始元素上定义的变量设置值,因为我们正在遍历它自己的属性。另外它不是很有效。如果那是你想要的,不妨循环使用默认值:

_.forOwn(defaultValues, function (value, key) {
  if (myObject[key] === undefined || myObject[key] === null)
    myObject[key] = value;
});

function getSampleObject() {
  return {
    a: null,
    b: NaN,
    // c: undefined,
    d: undefined,
    e: 'original'
}};

var defaultValues = {
  a: 1,
  b: 2,
  c: 3,
  d: 4,
  e: 5
};

var myObject = getSampleObject();
_.forOwn(myObject, function (value, key) {
  myObject[key] = _.defaultTo(value, defaultValues[key]);
});

console.log('defaultTo', myObject);

var myObject = getSampleObject();
_.defaults(myObject, defaultValues);

console.log('defaults', myObject);

var myObject = getSampleObject();
_.forOwn(defaultValues, function (value, key) {
  if (myObject[key] === undefined || myObject[key] === null)
    myObject[key] = value;
});

console.log('handmade', myObject);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

感谢@Jacque 对 null 值的解释。然而,由于不幸的继承代码,我正在处理 returns null 值的对象,即使它是为 undefined 而设计的。这是我通过省略将导致 undefinednull 属性以更具声明性的方式实现此目的的方法,结果将为其值创建默认值。

const alphabet = {
  a: 'A is for apple',
  // b: undefined,
  c: 'C is for cake',
  d: null,
}
const nonNulls = _.omitBy(alphabet, _.isNull) // Omitting null values.
const longer = _.defaults(nonNulls, {
  b: 'B is for boy',
})

console.info('Longer Way', longer)

// Or even shorter
const shorter = _.defaults(_.omitBy(alphabet, _.isNull), {
  b: 'B is for boy',
})

console.info('Shorter Way', shorter)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>