【发布时间】:2017-04-01 13:14:08
【问题描述】:
我知道_.defaults 函数可以为具有undefined 键的对象设置默认值。但是它不适用于null 的键。有没有办法做到这一点?
【问题讨论】:
标签: javascript underscore.js lodash
我知道_.defaults 函数可以为具有undefined 键的对象设置默认值。但是它不适用于null 的键。有没有办法做到这一点?
【问题讨论】:
标签: javascript underscore.js lodash
感谢@Jacque 对null 值的解释。然而,由于不幸的继承代码,我正在处理的对象返回null 值,即使它是为undefined 设计的。这是我通过省略null 属性以更具声明性的方式实现这一点的方法,这将导致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)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
【讨论】:
_.defaults 助手的这种行为背后的原因是,undefined 表示尚未设置属性,null 传达了明确设置为不引用任何内容的含义。
如果你仍然认为你的变量应该保持null 并用一个函数设置,那么你可以使用_.defaultTo,这个函数通常返回它的第一个参数,如果第一个参数是NaN,则返回第二个参数,@ 987654327@ 或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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
【讨论】: