1.从数组创建键(值)对象
let users = [
{id: 'john', name: "John Smith", age: 20},
{id: 'ann', name: "Ann Smith", age: 24},
{id: 'pete', name: "Pete Peterson", age: 31},
];
let usersById = groupById(users);
function groupById(arr){
return arr.reduce((obj,item)=>{
obj[item.id]=obj
return obj},{})
}
/*期望行为
// 调用函数后,我们应该得到:
usersById = {
john: {id: 'john', name: "John Smith", age: 20},
ann: {id: 'ann', name: "Ann Smith", age: 24},
pete: {id: 'pete', name: "Pete Peterson", age: 31},
}
*/
2.数组去重
function unique(arr) {
let result = [];
for (let str of arr) {
if (!result.includes(str)) {
result.push(str);
}
}
return result;
}
let strings = ["Hare", "Krishna", "Hare", "Krishna",
"Krishna", "Krishna", "Hare", "Hare", ":-O"
];
alert( unique(strings) ); // Hare, Krishna, :-O
//
方法 result.includes(str) 在内部遍历数组 result,并将每个元素与 str 进行比较以找到匹配项。
所以如果 result 中有 100 个元素,并且没有任何一项与 str 匹配,那么它将遍历整个 result 并进行 100 次比较。如果 result 很大,比如 10000,那么就会有 10000 次的比较。
这本身并不是问题,因为 JavaScript 引擎速度非常快,所以遍历一个有 10000 个元素的数组只需要几微秒。
但是我们在 for循环中对 arr 的每个元素都进行了一次检测。
因此,如果 arr.length 是 10000,我们会有 10000 * 10000 = 1 亿次的比较。那真的太多了。
3.对数字求和到给定值
题目:编写一个函数sumTo(n) ,计算1+2+3+…+n的和
用三种方法实现:①循环②递归③等差数列求和公式
① 循环的话 速度2
function sumTo(n){
let sum=0;
for(let i=1;i<=n;i++){
sum+=i
}
return sum
}
sumTo(100)//5050
②递归方法 占用资源 慢一些
function sumTo(n){
if(n==1)return 1;
return n+sumTo(n-1)
}
sumTo(100)
③ 公式:sumTo(n)=n*(n+1)/2 !!!速度最快 1
function sumTo(n){
return n*(n+1)/2
}
sumTo(100)