【速記】如何用一行代碼將駝峯風格的字符串轉化成中劃線風格的字符串

起源

今天在閱讀snabbdom(一個Virtual DOM 庫)的關於處理元素自定義屬性的時候,發現了將駝峯風格的字符串轉化成中劃線風格的字符串的技巧,以方便根據dataset來移除實際DOM元素對應的attribute,至於DOM對象的dataset和HTML自定義屬性的對應規則,你能夠閱讀這邊文檔:https://developer.mozilla.org...javascript

發現代碼位置

文件src/modules/dataset.tsjava

import {VNode, VNodeData} from '../vnode';
import {Module} from './module';

export type Dataset = Record<string, string>;

const CAPS_REGEX = /[A-Z]/g;  //匹配大寫字母

function updateDataset(oldVnode: VNode, vnode: VNode): void {
  let elm: HTMLElement = vnode.elm as HTMLElement,
    oldDataset = (oldVnode.data as VNodeData).dataset,
    dataset = (vnode.data as VNodeData).dataset,
    key: string;

  if (!oldDataset && !dataset) return;
  if (oldDataset === dataset) return;
  oldDataset = oldDataset || {};
  dataset = dataset || {};
  const d = elm.dataset;

  for (key in oldDataset) {
    if (!dataset[key]) {
      if (d) {
        if (key in d) {
          delete d[key];
        }
      } else {
        elm.removeAttribute('data-' + key.replace(CAPS_REGEX, '-$&').toLowerCase()); 
      }
    }
  }
  for (key in dataset) {
    if (oldDataset[key] !== dataset[key]) {
      if (d) {
        d[key] = dataset[key];
      } else {
        elm.setAttribute('data-' + key.replace(CAPS_REGEX, '-$&').toLowerCase(), dataset[key]); 
      }
    }
  }
}

export const datasetModule = {create: updateDataset, update: updateDataset} as Module;
export default datasetModule;

代碼樣例

"theStringYouWanToChange".replace(/[A-Z]/g,'-$&').toLowerCase();

運行結果

"the-string-you-wan-to-change"

相關文檔

String.prototype.replace(): https://developer.mozilla.org...node

相關文章
相關標籤/搜索