# 使用对象代替条件 if 判断
在某些条件下,我们需要根据变量的值来调用不同的函数或者赋值。一般我们遇到这种情况可能会写大量的 if 条件判断块,但是大量的 if 代码不利于代码阅读和理解,有些时候我们可以使用对象来解决此问题。
像以下例子中,使用了大量的 if else 判断条件,使得代码变得难以理解。
function func(type) { | |
if (type == 'a') { | |
return 1; | |
} else if (type == 'b') { | |
return 2; | |
} else if (type == 'c') { | |
return 3; | |
} else { | |
return 4; | |
} | |
} |
我们可以将上述例子重构:
function func(type) { | |
const objType = { | |
a: 1, | |
b: 2, | |
c: 3, | |
default: 4 | |
} | |
return objType[type] || objType.default | |
} |
上述方法不仅仅可以重构 if else 语句,也可以重构 switch case 语句:
function func(type) { | |
switch(type) { | |
case 'a': | |
func1(); | |
break; | |
case 'b': | |
func2(); | |
break; | |
case 'c': | |
func3(); | |
break; | |
default: | |
func4(); | |
break; | |
} | |
} |
上述的 switch case 例子我们可以重构为:
function func(type) { | |
const obj = { | |
a: func1(), | |
b: func2(), | |
c: func3(), | |
default: func4() | |
} | |
return obj[type]() || obj.default(); | |
} |
上述这些例子中,如果对象不需要更改的话,我们可以将它移动到更高的作用域范围中。上述的这些情况可能只适合一些简单的情况,对于一些复杂的情况可能并不适合,不能盲目的使用。
# 其他使用对象的例子
当我们有需求查找一个数组中出现最多次数的元素时,我们可能会这么做:
function findMaxItem() { | |
const arr = [1,2,5,2,1,3,5,6,8,5,9,10,11,2,4] | |
let max = {value: '', times: 0}; | |
for (let i in arr) { | |
cosnt time = list.filter(item => item === i).length; | |
if (time > max.times) { | |
max = {value: i, times: time}; | |
} | |
} | |
return max; | |
} |
上述的例子中我们嵌套了一次循环才得到列表中出现最多的元素,因为这里嵌套一次循环,所以这个例子在事件上的复杂度是 O (n²) ,试想下,如果数据量很大的情况下这种方法很显然不够好!我们可以将上述方法重构如下:
function findMaxItem() { | |
const arr = [1,2,5,2,1,3,5,6,8,5,9,10,11,2,4] | |
const itemList = {}; | |
let max = {value: '', times: 0}; | |
for (let i in arr) { | |
itemList[i] = (itemList[i] || 0) + 1; | |
} | |
for (let i of Object.keys(itemList)) { | |
if (itemList[i] > max.times) { | |
max = {value: i, times: itemList[i]}; | |
} | |
} | |
} |
上述例子中,虽然我们有两个循环,但是却不是嵌套的相比于之前的嵌套循环,我们重构后的例子更加的合理,事件复杂度也是 O (n)。因此重构后的例子性能上更加的出众!
上述的例子,只是开发中的一些小技巧,希望你能喜欢。javascript 开发中还有很多便捷开发的小技巧,也希望你能提出你在日常开发中的一些简洁的操作!
# js 删除对象里的某个属性
# 使用 delete
let a = {b:1,c:2} | |
delete a.b//true | |
console.log(a)//{c:2} |
# 使用解构
let a = {b:1,c:2} | |
let {b,...a} = a | |
console.log(a)//{c:2} |
# 使用反射
let a = {b:1,c:2} | |
Reflect.deleteProperty(a,"b"); | |
console.log(a)//{c:2} |