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

时间:2017-04-01 13:14:08

标签: javascript underscore.js lodash

我知道_.defaults函数可以为具有undefined键的对象设置默认值。但是它不适用于null的密钥。有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:4)

感谢@Jacque关于null值的解释。但是由于不幸的继承代码,我正在处理的对象返回null值,即使它是针对undefined的。这是我通过省略导致null的{​​{1}}属性以更具说明性的方式实现此目的的方法,因此将为其值创建默认值。

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

答案 1 :(得分:2)

_.defaults助手的这种行为背后的原因是undefined表示尚未设置属性,而null表达明确设置为无效的含义

如果您仍然认为您的变量应该保持null并且使用函数设置,那么您可以使用_.defaultTo,一个正常返回其第一个参数的函数,如果第一个参数是{,则返回第二个参数{ {1}},NaNnull。你需要自己循环遍历所有对象的密钥。

undefined

但是,这不会为原始元素上甚至没有定义的变量设置值,因为我们会循环遍历自己的属性。而且效率不高。如果这是你想要的,也可以改为默认循环:

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