减少代码行数和加快开发的技术!

我们在开发中,经常要写一些函数,如排序、搜索、寻找唯一的值、传递参数、交换值等,在这里我列出了我搜集的一些技术资源,可以像高手一样写出这些函数!

JavaScript确实是一门很好的开发语言。对于给定的问题,可以有不止一种方法来达到相同的解决方案。在这篇文章中,我们将讨论最快速的方法。

这些方法肯定会对你有帮助:

  • 减少LOC(代码行)的数量
  • 编码竞赛
  • 黑客马拉松
  • 或者其他限时任务

这些JavaScript黑客技术大多使用ECMAScript6(ES2015)以后的技术,尽管最新版本是ECMAScript11(ES2020)。

注意:下面所有的技巧都是在谷歌浏览器的控制台测试的。

1. 申明和初始化数组

可以用默认值来初始化特定大小的数组,如""、null或0。你可能已经把这些用于一维数组,但如何初始化二维数组/矩阵呢?

const array = Array(5).fill('');
// Output
(5) ["", "", "", "", ""] const matrix = Array(5).fill(0).map(()=>Array(5).fill(0));
// Output
(5) [Array(5), Array(5), Array(5), Array(5), Array(5)]
0: (5) [0, 0, 0, 0, 0]
1: (5) [0, 0, 0, 0, 0]
2: (5) [0, 0, 0, 0, 0]
3: (5) [0, 0, 0, 0, 0]
4: (5) [0, 0, 0, 0, 0]
length: 5

 

2.进行求和、最小值和最大值

使用reduce方法来快速进行基本的数学运算。

const array  = [5,4,7,8,9,2];
  • 求和
array.reduce((a,b) => a+b);
// Output: 35
  • 最大值
array.reduce((a,b) => a>b?a:b);
// Output: 9
  • 最小值
array.reduce((a,b) => a<b?a:b);
// Output: 2

 

3. 对字符串、数字或对象的数组进行排序

有内置的sort()和reverse()方法来对字符串进行排序,但对数字或对象数组的排序呢?
数字和对象的排序技巧,可以按照递增和递减的顺序进行排序。

  • 字符串排序
const stringArr = ["Joe", "Kapil", "Steve", "Musk"]
stringArr.sort();
// Output
(4) ["Joe", "Kapil", "Musk", "Steve"] stringArr.reverse();
// Output
(4) ["Steve", "Musk", "Kapil", "Joe"]
  • 数字排序
const array  = [40, 100, 1, 5, 25, 10];
array.sort((a,b) => a-b);
// Output
(6) [1, 5, 10, 25, 40, 100] array.sort((a,b) => b-a);
// Output
(6) [100, 40, 25, 10, 5, 1]
  • 对象排序
const objectArr = [
{ first_name: 'Lazslo', last_name: 'Jamf' },
{ first_name: 'Pig', last_name: 'Bodine' },
{ first_name: 'Pirate', last_name: 'Prentice' }
];
objectArr.sort((a, b) => a.last_name.localeCompare(b.last_name));
// Output
(3) [{…}, {…}, {…}]
0: {first_name: "Pig", last_name: "Bodine"}
1: {first_name: "Lazslo", last_name: "Jamf"}
2: {first_name: "Pirate", last_name: "Prentice"}
length: 3

4. 是否需要从一个数组中过滤掉无用的值?

像0,undefined,null,false,"",''这样的值可以通过下面的技巧轻松过滤。

const array = [3, 0, 6, 7, '', false];
array.filter(Boolean);
// Output
(3) [3, 6, 7]

5. 为各种条件使用逻辑运算符

如果你想减少嵌套,比如if...else或switch,可以使用逻辑运算符AND/OR。

function doSomething(arg1){
arg1 = arg1 || 10;
// set arg1 to 10 as a default if it’s not already set
return arg1;
} let foo = 10;
foo === 10 && doSomething();
// is the same thing as if (foo == 10) then doSomething();
// Output: 10 foo === 5 || doSomething();
// is the same thing as if (foo != 5) then doSomething();
// Output: 10

6. 删除重复的值

你可能已经在for循环中使用了indexOf(),它返回第一个找到的索引,或者使用较新的includes(),它从数组中返回布尔值true/false,以找出/删除重复的值。这里我们有两种更快捷的方法。

const array  = [5,4,7,8,9,2,7,5];
array.filter((item,idx,arr) => arr.indexOf(item) === idx);
// or
const nonUnique = [...new Set(array)];
// Output: [5, 4, 7, 8, 9, 2]

7. 创建一个计数器对象或Map

很多时候,需要通过创建计数器对象或Map来解决问题,该对象以变量为键,以其频率/出现次数为值来跟踪变量。

let string = 'kapilalipak';

const table={};
for(let char of string) {
table[char]=table[char]+1 || 1;
}
// Output
{k: 2, a: 3, p: 2, i: 2, l: 2}

const countMap = new Map();
for (let i = 0; i < string.length; i++) {
if (countMap.has(string[i])) {
countMap.set(string[i], countMap.get(string[i]) + 1);
} else {
countMap.set(string[i], 1);
}
}
// Output
Map(5) {"k" => 2, "a" => 3, "p" => 2, "i" => 2, "l" => 2}

8. 三元运算符很酷

你可以用三元运算符避免嵌套条件if...elseif...elseif。

function Fever(temp) {
return temp > 97 ? 'Visit Doctor!'
: temp < 97 ? 'Go Out and Play!!'
: temp === 97 ? 'Take Some Rest!';
} // Output
Fever(97): "Take Some Rest!"
Fever(100): "Visit Doctor!"

9. 与传统的once相比,for循环更快。

for 和 for...in 默认会得到索引,但你可以使用 arr[index]。

for...in也接受非数字,所以要避免它。

forEach, for...of 可以直接得到元素。

forEach也可以得到索引,但for...of不能。

10. 合并两个对象

在日常工作中,我们经常需要合并多个对象。

const user = {
name: 'Kapil Raghuwanshi',
gender: 'Male'
};
const college = {
primary: 'Mani Primary School',
secondary: 'Lass Secondary School'
};
const skills = {
programming: 'Extreme',
swimming: 'Average',
sleeping: 'Pro'
}; const summary = {...user, ...college, ...skills}; // Output
gender: "Male"
name: "Kapil Raghuwanshi"
primary: "Mani Primary School"
programming: "Extreme"
secondary: "Lass Secondary School"
sleeping: "Pro"
swimming: "Average"

11. 箭头函数

箭头函数表达式是传统函数表达式的一个紧凑的替代方案,但它有局限性,不能在所有情况下使用。因为它们有词法范围(parental scope),没有自己的this和arguments,因此它们指的是它们被定义的环境。

const person = {
name: 'Kapil',
sayName() {
return this.name;
}
}
person.sayName();
// Output
"Kapil"

箭头函数改写为:

const person = {
name: 'Kapil',
sayName() {
return this.name;
}
}
person.sayName();
// Output
"Kapil"

1

2. 可选链式

如果在?之前的值是未定义的或空的,可选链式?就会停止评估,并返回未定义。

const user = {
employee: {
name: "Kapil"
}
};
user.employee?.name;
// Output: "Kapil"
user.employ?.name;
// Output: undefined
user.employ.name
// Output: VM21616:1 Uncaught TypeError: Cannot read property 'name' of undefined

13. 打乱一个数组

使用内置的Math.random()方法。

const list = [1, 2, 3, 4, 5, 6, 7, 8, 9];
list.sort(() => {
return Math.random() - 0.5;
});
// Output
(9) [2, 5, 1, 6, 9, 8, 4, 3, 7]
// Call it again
(9) [4, 1, 7, 5, 3, 8, 2, 9, 6]

14. 空值合并运算符

空值合并运算符(??)是一个逻辑运算符,当其左侧的操作数为空或未定义时,返回其右侧的操作数,否则返回其左侧的操作数。

const foo = null ?? 'my school';
// Output: "my school" const baz = 0 ?? 42;
// Output: 0

15. Rest & Spread 运算符

那些神秘的3个点...可以Rest或Spread!

function myFun(a,  b, ...manyMoreArgs) {
return arguments.length;
}
myFun("one", "two", "three", "four", "five", "six"); // Output: 6

const parts = ['shoulders', 'knees'];
const lyrics = ['head', ...parts, 'and', 'toes']; lyrics;
// Output:
(5) ["head", "shoulders", "knees", "and", "toes"]

16. 缺省参数

const search = (arr, low=0,high=arr.length-1) => {
return high;
}
search([1,2,3,4,5]); // Output: 4

 

17. 将十进制转换为二进制或十六进制

我们可以使用一些内置的方法,如.toPrecision()或.toFixed()来帮助实现此类问题。

num.toString(2);
// Output: "1010"
num.toString(16);
// Output: "a"
num.toString(8);
// Output: "12"

18. 使用解构简单交换2个值

let a = 5;
let b = 8;
[a,b] = [b,a] [a,b]
// Output
(2) [8, 5]

19. 单行回文检查

function checkPalindrome(str) {
return str == str.split('').reverse().join('');
}
checkPalindrome('naman');
// Output: true

20. 将对象的属性变成一个数组的属性

使用Object. entries(),Object.key()和Object.values()。

const obj = { a: 1, b: 2, c: 3 };

Object.entries(obj);
// Output
(3) [Array(2), Array(2), Array(2)]
0: (2) ["a", 1]
1: (2) ["b", 2]
2: (2) ["c", 3]
length: 3 Object.keys(obj);
(3) ["a", "b", "c"] Object.values(obj);
(3) [1, 2, 3]

我整理的就这些了,兄弟们。

如果想跟我一起学习,请关注我。

20个提高开发效率的JavaScript技巧的更多相关文章

  1. 实用手册:130+ 提高开发效率的 vim 常用命令

    Vim 是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器.这里收录了130+程 ...

  2. 提高开发效率的 Eclipse 实用操作

    工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分 ...

  3. 能够提高开发效率的Eclipse实用操作

    工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分 ...

  4. 能够提高开发效率的 Eclipse 实用操作

    工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分 ...

  5. Android开发效率的小技巧

    提高eclipse使用效率(二) 提高Android开发效率的小技巧   XML文件的代码提示 adt中也有xml文件的代码提示,为了让提示来的更加猛烈,我们还要设置一下 打开eclipse - Wi ...

  6. GitHub Java项目推荐|功能丰富的 Java 工具包|提高开发效率

    GitHub Java项目推荐|功能丰富的 Java 工具包|提高开发效率 功能丰富的 Java 工具包.它帮助我们实现了常用的工具方法,从而减少代码的体积,提高开发效率.该项目最初是作者工作项目中的 ...

  7. 如何利用 Visual Studio 自带工具提高开发效率

    Visual Stuido 是一款强大的Windows 平台集成开发工具,你是否好好地利用了它呢? 显示行号 有些时候(比如错误定位)的时候,显示行号将有利于我们进行快速定位. 如何显示 1. 工具 ...

  8. 成吨提高开发效率:Intellij Shortcuts精简子集与思维模式

    在线精简cheatsheet备查表:intellij.linesh.twGithub项目:intellij-mac-frequent-keymap Intellij的快捷键多而繁杂,从官方推荐的key ...

  9. 善用VS中的Code Snippet来提高开发效率

    http://www.cnblogs.com/anderslly/archive/2009/02/16/vs2008-code-snippets.html http://www.cnblogs.com ...

随机推荐

  1. POJ3422简单费用流

    题意:      给一个n*n的矩阵,从左上角走到右下角,的最大收益,可以走k次,每个格子的价值只能取一次,但是可以走多次. 思路:       比较简单的一个费用流题目,直接拆点,拆开的点之间连接两 ...

  2. CVE-2012-1876:Internet Exporter MSHTML.DLL CaculateMinMax 堆溢出简单分析

    0x01 2012 Pwn2Own 黑客大赛 Pwn2Own 是世界上最著名的黑客大赛,意在激励白帽黑客们进行顶尖的安全研究.在 2012 年 Pwn2Own 大赛上,来自法国著名的安全团队 Vupe ...

  3. 通过 Netty、ZooKeeper 手撸一个 RPC 服务

    说明 项目链接 微服务框架都包括什么? 如何实现 RPC 远程调用? 开源 RPC 框架 限定语言 跨语言 RPC 框架 本地 Docker 搭建 ZooKeeper 下载镜像 启动容器 查看容器日志 ...

  4. jquery中定义数组并给数组赋值后转为json格式为[]问题的解决

    一.问题描述:jquery定义一个空数组,并赋值,结果转为json格式后打印值为空 我原本是这样写的,但是show_data值一直为[] var export_data = [];export_dat ...

  5. 阿里面试官用HashMap把我问倒了

    本人是一名大三学生,最近在找暑期实习,其中也面试过两次阿里,一次菜鸟网络部门.一次网商银行部门,当然我都失败了,同时也让我印象很深刻,因此记录了其中一些面试心得,我觉得这个问题很值得分享,因此分享给大 ...

  6. 如何实现一个简易版的 Spring - 如何实现 AOP(上)

    前言 本文是「如何实现一个简易版的 Spring 系列」的第五篇,在之前介绍了 Spring 中的核心技术之一 IoC,从这篇开始我们再来看看 Spring 的另一个重要的技术--AOP.用过 Spr ...

  7. [Java] Structs

    背景 基于MVC的WEB框架 在表示层过滤访问请求并处理 步骤 在eclipse中创建Web动态项目 导入相关jar包到WEB-INF/lib 在WEB-INF目录下新建web.xml,配置Filte ...

  8. Docker Swarm(八)滚动更新、回滚服务

    滚动更新.回滚服务 默认情况下, swarm一次只更新一个副本,并且两个副本之间没有等待时间,我们可以通过: # 定义并行更新的副本数量--update-parallelism# 定义滚动更新的时间间 ...

  9. 列出 Ubuntu 和 Debian 上已安装的软件包

    列出 Ubuntu 和 Debian 上已安装的软件包 如果你经常用 apt 命令,你可能觉得会有个命令像 apt 一样可以列出已安装的软件包.不算全错. apt-get 命令 没有类似列出已安装软件 ...

  10. 9.13-15 runlevel & init & service

    runlevel:输出当前运行级别 runlevel命令用于输出当前Linux系统的运行级别. -quiet 不输出结果,用于通过返回值判断的场合 [root@cs6 ~]# runlevel N 3 ...