告别 spread:拥抱 default composer 吧

职场   科技   2024-11-16 17:42   浙江  

在JavaScript中使用对象时,通常需要为strings/objects/arraysnullundefined属性设置默认值。

而在处理嵌套对象时,这种情况不但更加难以处理,而且编程逻辑也更为复杂。

但是,使用default-composer库,任务就变得简单多了。

什么是default-composer?

default-composer是一个轻量级(~300B)的JavaScript库,允许你为嵌套对象设置默认值。

github地址:https://github.com/aralroca/default-composer

该库将现有对象中的空strings/arrays/objectsnullundefined值替换为定义的默认值,帮助简化编程逻辑并减少设置默认值所需的代码量。

相对于spread运算符和Object.assign的优势

我们知道,…spread运算符和Object.assign()也可用于设置对象的默认值,default-composer相对于这些方法的优势在于:

  • 适用于嵌套对象,而spread运算符和Object.assign()仅适用于浅层对象。

  • spread运算符或Object.assign()更简洁、更易于阅读。

    使用后两种方法设置默认值所需的代码可能会非常冗长且难以阅读,尤其是在处理嵌套对象时。

  • 更精细地控制哪些属性应设置为默认值。

假设有这样一个初始对象:

const original = {
  name"",
  scorenull,
  address: {
    street"",
    city"",
    state"",
    zip"",
  },
  emails: [],
  hobbies: [],
  another"anotherValue"
};

默认值如下:

const defaults = {
  name"John Doe",
  score5,
  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


热门推荐

JavaScript 逆向破解某租车微信小程序

正则表达式背后的灾难和危机

12 个强大而实用的 JavaScript 动画库

HTML5 新魔法:打造梦幻水波涟漪动画

前端新世界
关注前端技术,分享互联网热点
 最新文章