(七)前端javascript中的函数式编程技巧2

函数式编程范式的技巧

  • 迭代算法-可以替代for in
js 复制代码
let count = 10;

while (count--) {
   console.log(count);
}
  • 斐波拉契的实现
js 复制代码
 function fabci(n) {
   console.log("🚀 ~ fabci ~ n:", n);
   if (n === 1 || n === 2) {
     return 1;
   }
   return fabci(n - 1) + fabci(n - 2);
 }

 const result = fabci(10);
 console.log(result);
  • 不使用递归,实现斐波那契数列
js 复制代码
function getFb(num) {
  let n1 = 1,
    n2 = 1,
    n3;

  for (let i = 3; i <= num; i++) {
    n3 = n1 + n2;
    console.log(n3);
    n1 = n2;
    n2 = n3;
  }
  return n3;
}

const fb1 = getFb(10);
console.log("🚀 ~ fb1:", fb1); //55
  • 查询最小索引
js 复制代码
//随机10个数据,范围在20,100之间,不重复,直接声明一个数组
const data = [21, 23, 45, 67, 89, 100, 12, 14, 16, 18];

function getMinIndex(data) {
  let min = 0;
  for (let i = 1; i < data.length; i++) {
    if (data[i] < data[min]) {
      min = i;
    }
  }
  return min;
}

const ret = getMinIndex(data);
console.log(ret); //6
  • 查询最小值
js 复制代码
function getMin(data) {
  let min = data[0];
  for (let i = 1; i < data.length; i++) {
    if (data[i] < min) {
      min = data[i];
    }
  }
  return min;
}
const ret2 = getMin(data);
console.log(ret2); //12

函数式编程

  • 求最小值
js 复制代码
function getMinFn(data) {
  return Math.min(...data);
}
const ret3 = getMinFn(data);
console.log(ret3); //12
  • 优化
js 复制代码
const getMinFn2 = (data) => Math.min(...data); //箭头函数
const ret4 = getMinFn2(data);
console.log(ret4); //12
  • map
    • 不使用map
js 复制代码
let result = [];
for (let i = 0; i < data.length; i++) {
  result.push(data[i] * 2);
}

console.log("🚀 ~ result:", result);
// 🚀 ~ result: [
//   42, 46, 90, 134, 178,
//  200, 24, 28,  32,  36
// ]
  • 使用map
js 复制代码
const ret5 = data.map((item) => item * 2);
console.log("🚀 ~ ret5:", ret5);
// 🚀 ~ result: [
//   42, 46, 90, 134, 178,
//  200, 24, 28,  32,  36
// ]
console.log("🚀 ~ data:", data);
  • reduce
    // 1.求和
js 复制代码
const arr2 = [1, 2, 3, 4];
const ret6 = arr2.reduce((prev, next) => prev + next, 0);
console.log("🚀 ~ ret6:", ret6);

// 合并对象

js 复制代码
const a = {
  name: "张三",
  age: 18,
};
const b = {
  sex: "男",
  height: 170,
};
const c = {
  name: "孙悟空",
};
const a1 = [a, b, c];
const ret7 = a1.reduce((prev, next) => {
  return Object.assign(prev, next);
}, {});
console.log("🚀 ~ ret7 ~ ret7:", ret7);

//命名空间,路径转对象 a.b.c 转成 obj = {a:{b:c}},

js 复制代码
let ns = {};
function createNamespace(path) {
  // 将路径分解为组成部分
  var parts = path.split(".");

  var parent = ns; // 命名空间的根是ns对象
  // debugger;
  // 遍历路径的各个部分
  for (var i = 0; i < parts.length; i++) {
    var part = parts[i];
    // 如果当前父对象上没有这个属性,则创建它
    if (typeof parent[part] === "undefined") {
      parent[part] = {};
    }
    // 移动到下一级命名空间
    parent = parent[part];
  }

  // 返回创建的命名空间的最里层对象
  return ns;
}

// 使用示例
var ns1 = createNamespace("a.b.c.d");
console.log(ns1);
// 🚀 ~ ns: { a: { b: { c: { d: {} } } }
const ns2 = createNamespace("e.f");
console.log(ns2);
// 1. a.b.c 转成 obj = {a:{b:c}}
let obj = {};

obj["a"] = {};
obj["a"]["c"] = 2;
obj["b"] = 2;

console.log(obj, "999");
相关推荐
ZC跨境爬虫18 分钟前
Scrapy实战爬取5sing网站:Pipeline优化+全流程踩坑复盘,从报错到数据落地
前端·爬虫·python·scrapy
牛马11128 分钟前
Flutter BoxDecoration
前端·javascript·flutter
M ? A1 小时前
VuReact 编译器核心重构:统一管理组件元数据收集
前端·javascript·vue.js·react.js·重构·开源
山海AI手册1 小时前
030、AI应用前端展示:Streamlit快速构建交互式Web应用
前端·人工智能
专注VB编程开发20年1 小时前
C#异步状态机,内部的信号机制TaskCompletionSource
前端
csdn_aspnet1 小时前
在无状态 ASP.NET Core 8 Web API 中实现 CSRF 令牌,无需 Views/MVC!
前端·csrf·.net core
ByteCraze1 小时前
手写高性能虚拟列表(详解!!!)
javascript·学习
M ? A1 小时前
Vue转React最佳工具对比:Vuera、Veaury与VuReact
前端·javascript·vue.js·经验分享·react.js
We་ct1 小时前
JS手撕:函数进阶 & 设计模式解析
开发语言·前端·javascript·设计模式·面试·前端框架
悟空瞎说2 小时前
前端老鸟实战:纯 CSS 实现小红书「真・瀑布流」,零 JS、自动错落、生产可用
前端