我知道_.defaults
函数可以为具有undefined
键的对象设置默认值。但是它不适用于null
的密钥。有没有办法实现这个目标?
答案 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}},NaN
或null
。你需要自己循环遍历所有对象的密钥。
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);