在JavaScript中使用对象时,通常需要为strings
/objects
/arrays
、null
或undefined
属性设置默认值。
而在处理嵌套对象时,这种情况不但更加难以处理,而且编程逻辑也更为复杂。
但是,使用default-composer库,任务就变得简单多了。
什么是default-composer?
default-composer是一个轻量级(~300B)的JavaScript库,允许你为嵌套对象设置默认值。
github地址:https://github.com/aralroca/default-composer
该库将现有对象中的空strings
/arrays
/objects
、null
或undefined
值替换为定义的默认值,帮助简化编程逻辑并减少设置默认值所需的代码量。
相对于spread运算符和Object.assign的优势
我们知道,…spread
运算符和Object.assign()
也可用于设置对象的默认值,default-composer相对于这些方法的优势在于:
适用于嵌套对象,而
spread
运算符和Object.assign()
仅适用于浅层对象。比
spread
运算符或Object.assign()
更简洁、更易于阅读。使用后两种方法设置默认值所需的代码可能会非常冗长且难以阅读,尤其是在处理嵌套对象时。
更精细地控制哪些属性应设置为默认值。
假设有这样一个初始对象:
const original = {
name: "",
score: null,
address: {
street: "",
city: "",
state: "",
zip: "",
},
emails: [],
hobbies: [],
another: "anotherValue"
};
默认值如下:
const defaults = {
name: "John Doe",
score: 5,
address: {
street: "123 Main St",
city: "Anytown",
state: "CA",
zip: "12345",
},
emails: ["john.doe@example.com"],
hobbies: ["reading", "traveling"],
};
我们希望合并这些对象,将“”
、null
、[]
、undefined
和{}
的初始值替换为默认值。
我们需要:
console.log(results)
/**
* {
* "name": "John Doe",
* "score": 5,
* "address": {
* "street": "123 Main St",
* "city": "Anytown",
* "state": "CA",
* "zip": "12345"
* },
* "emails": [
* "john.doe@example.com"
* ],
* "hobbies": [
* "reading",
* "traveling"
* ],
* "another": "anotherValue"
**/
如果是spread
运算符,我们需要:
const results = {
...defaults,
...original,
name: original.name || defaults.name,
score: original.score ?? defaults.score, // "??" beacause 0 is valid
address: {
...defaults.address,
...original.address,
street: original.address.street || defaults.address.street,
city: original.address.city || defaults.address.city,
state: original.address.state || defaults.address.state,
zip: original.address.zip || defaults.address.zip,
},
emails: original.emails.length ? original.emails : defaults.emails,
hobbies: original.hobbies.length ? original.hobbies : defaults.hobbies,
};
而使用Object.assign
则需要这样做:
const results = {
...defaults,
...original,
name: original.name || defaults.name,
score: original.score ?? defaults.score, // "??" beacause 0 is valid
address: {
...defaults.address,
...original.address,
street: original.address.street || defaults.address.street,
city: original.address.city || defaults.address.city,
state: original.address.state || defaults.address.state,
zip: original.address.zip || defaults.address.zip,
},
emails: original.emails.length ? original.emails : defaults.emails,
hobbies: original.hobbies.length ? original.hobbies : defaults.hobbies,
};
维护起来不可谓不繁琐,尤其是那些大型的严重嵌套的对象。
想想就头大。
但是,使用defaultComposer ,我们只需要这样做:
import defaultComposer from 'default-composer'; // 300B
// ...
const results = defaultComposer(defaults, original);
容易维护多了,不是吗?
如果项目中有一个与其他属性不同的特殊属性,并且我们想要另一个替换逻辑,会发生什么?
在这种情况下,尽管defaultComposer
默认具有检测可取消值的配置,但你可以根据需要进行配置。
import { defaultComposer, setConfig } from 'default-composer';
setConfig({
// This function is executed for each value of each key that exists in
// both the original object and the defaults object.
isDefaultableValue: (
// - key: key of original or default object
// - value: value in the original object
// - defaultableValue: pre-calculed boolean, you can use or not,
// depending if all the rules of the default-composer library are correct
// for your project or you need a totally different ones.
{ key, value, defaultableValue }
) => {
if (key === 'rare-key') {
return defaultableValue || value === 'EMPTY'
}
return defaultableValue;
},
});
总结
本文介绍了default-composer库,可作为JavaScript嵌套对象设置默认值的解决方案。
该库是轻量级的,提供比spread
运算符和Object.assign
方法更简洁、更易于阅读的代码。还提供了关于对哪些属性应设置为默认值的更精细的控制。
总的来说,default-composer这个库非常有用,可帮助简化在JavaScript中为嵌套对象设置默认值的任务。
编码快乐!
END
热门推荐