告别 Spread 运算符:使用默认 Composer

在 JavaScript 中处理对象时,通常需要为空的strings// objects、或属性设置默认值。在处理嵌套对象时,这会变得更加复杂并且需要复杂的编程逻辑。然而,有了“ default-composer ”库,这项任务变得简单易行。arraysnullundefined 
 

什么是“默认作曲家”?

“ default-composer ” 是一个轻量级 (~300B) JavaScript 库,它允许您为嵌套对象设置默认值。该库将现有对象中的空字符串/数组/对象、null 或未定义值替换为已定义的默认值,这有助于简化编程逻辑并减少设置默认值所需的代码量。


 

告别 Spread 运算符:使用默认 Composer_第1张图片

默认作曲家徽标


 

优于 Spread 运算符和 Object.assign

虽然...spread运算符andObject.assign()也可用于设置对象的默认值,但 " default-composer" 提供了优于这些方法的几个好处。

  • 适用于嵌套对象,而展开运算符和Object.assign()仅适用于浅层对象。
  • 比扩展运算符或更简洁易读Object.assign()。使用这些方法设置默认值所需的代码可能会变得非常冗长且难以阅读,尤其是在处理嵌套对象时。
  • 更精细地控制哪些属性设置为默认值。与传播运营商和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: ["[email protected]"],
  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": [
 *   "[email protected]"
 * ],
 * "hobbies": [
 *   "reading",
 *   "traveling"
 * ],
 * "another": "anotherValue"
 **/

可能使用传播运算符我们将不得不做这样的事情:

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 = Object.assign({}, defaults, original, {
  name: original.name || defaults.name,
  score: original.score ?? defaults.score, // "??" beacause 0 is valid
  address: Object.assign({}, 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);

更容易维护,对吧?

告别 Spread 运算符:使用默认 Composer_第2张图片

越快乐越容易

如果在我们的项目中有一个与其他属性不同的特殊属性,并且我们想要另一个替换逻辑,会发生什么情况?好吧,虽然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 中为嵌套对象设置默认值的解决方案。

Object.assign该库是轻量级的,提供了比扩展运算符和方法更简洁、更易于阅读的代码。它还可以更精细地控制哪些属性应设置为默认值。

在本文中,我提供了有关如何使用该库以及它如何简化用于维护嵌套对象的代码的示例。

最后,我解释了如何配置该库来处理需要不同替换逻辑的特殊情况。总的来说,“ default-composer ”是一个有用的库,可以简化为 JavaScript 中的嵌套对象设置默认值的任务。

你可能感兴趣的:(composer,javascript,php)