有没有办法在 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 第一个参数和第二个参数的函数如果第一个是 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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
感谢@Jacque 对 null
值的解释。然而,由于不幸的继承代码,我正在处理 returns null
值的对象,即使它是为 undefined
而设计的。这是我通过省略将导致 undefined
的 null
属性以更具声明性的方式实现此目的的方法,结果将为其值创建默认值。
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
的键。有办法实现吗?
_.defaults
助手的这种行为背后的原因是 undefined
表示 属性 尚未设置,而 null
传达了明确设置的含义什么都不指。
如果您仍然认为您的变量应该包含 null
并用一个函数设置,那么您可以使用 _.defaultTo
,一个通常 returns 第一个参数和第二个参数的函数如果第一个是 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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
感谢@Jacque 对 null
值的解释。然而,由于不幸的继承代码,我正在处理 returns null
值的对象,即使它是为 undefined
而设计的。这是我通过省略将导致 undefined
的 null
属性以更具声明性的方式实现此目的的方法,结果将为其值创建默认值。
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>