由一个例子引出声明式编程和函数式编程的区别
const arr = [[1, 3, 6], [1, 6, 9], [2, 5], 8, [7, 1, 2, 3]];
将arr通过一些列处理后得到结果为: [1, 2, 3, 5, 6, 7, 8, 9]
通过分析,要得到上面的结果,数组需要经过 偏平化、去重、排序
下面用两种不同的编程方式来实现:
(一)、函数式编程(Imperative) :
命令式编程 命令式编程主要思想是关注计算机执行的步骤,即每一步应该做什么,怎么做
// 1、偏平化
const flatten = input => {
let result = [];
input.forEach(v => {
Array.isArray(v) ? (result = result.concat(flatten(v))) : result.push(v);
});
return result;
};
// 2、去重
const unique = input => {
let ret = [];
for (var i = 0; i < input.length; i++) {
if (ret.indexOf(input[i]) == -1) {
ret.push(input[i]);
}
}
return ret;
};
//3、排序(冒泡)
const sort = input => {
for (let i = 0; i < input.length - 1; i++) {
for (let j = 0; j < input.length - 1; j++) {
if (input[j] > input[j + 1]) {
let temp = input[j];
input[j] = input[j + 1];
input[j + 1] = temp;
}
}
}
return input;
};
//调用
let formatArr = sort(unique(flatten(arr)));
console.log('formatArr:', formatArr); // [1, 2, 3, 5, 6, 7, 8, 9]
(二)、声明式(Declarative):
声明式编程是以数据结构的形式来表达程序执行的逻辑。它的主要思想是告诉计算机应该做什么。接近自然语言,简洁优雅
let formatArr2 = [...new Set(arr.flat(Infinity))].sort((a, b) => a - b);
console.log('formatArr2:', formatArr2); // [1, 2, 3, 5, 6, 7, 8, 9]
通过上面两种编程方式实现后,得到的结果是一样的。
对比发现,声明式编程的重点在于做什么,而不是怎么去做。
对比命令式编程有明显的优点:简化了开发者的工作,减少了重复工作.,留下了改进的空间,提供了全局协调能力,代码清晰易懂,提高工作效率