使用对象代替条件 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}