Skip to content

常用的工具方法

1. once

javascript
function once(fn) {
  let done = false;
  return function (...args) {
    if (!done) {
      done = true;
      fn.call(this, ...args)
    }
  }
}

2. sleep

javascript
const sleep = (t = 0) => new Promise(resolve => setTimeout(resolve, t))

3. Tree结构

javascript
let arr = [
  { id: 2, name: '2', pid: 1 },
  { id: 3, name: '3', pid: 1 },
  { id: 4, name: '4', pid: 3 },
  { id: 5, name: '5', pid: 3 },
  { id: 1, name: '1', pid: 0 },
]

function arrToTree (arr) {
  let map = new Map(), result = [];
  arr.forEach(item => map.set(item.id, item))
  arr.forEach(item => {
    let parent = map.get(item.pid);
    if (parent) {
      if (!parent.children) {
        parent.children = []
      }
      parent.children.push(item)
    } else {
      result.push(item)
    }
  })
  return result;
}

console.log(arrToTree(arr));

4. 简单的模板渲染

javascript
function render (template, data) {
  // \s对空格进行匹配,前后空格都可有N个或没有
  const reg = /\{\{\s*(\w+)\s*\}\}/g;
  return template.replace(reg, (sign, key) => {
    // sign:匹配到正则值,如{{name}}
    // key:匹配到的值,如name
    return data[key]
  })
}

let template = '我是{{name}},年龄{{age}},性别{{ sex}},身高{{height}}';
let person = {
    name: '小朋',
    age: 24,
    sex: '男'
}
console.log(render(template, person));

5. 对象合并

6. 柯里化

javascript
const currying = (fn, ...args) => {
  if (args.length >= fn.length) {
    return fn.call(fn, ...args);
  }
  return (...rest) => currying(fn, ...args, ...rest);
}