数组去重
1 function distinct(arr) {
return arr.filter(function (elem,index,arr){
return arr.indexOf(elem,index+1) === -1;
});
}
console.log(distinct(arr));
2 function unique(arr){
var obj={};
var reset=[];
for(var i=0;i<arr.length;i++){
if(!obj[arr[i]]){
obj[arr[i]]=1;
reset.push(arr[i]);
}
}
return reset;
}
var arr=['1','2','3','1','4','5'];
console.log(unique(arr));
//字符串去重
function strUnique(str){
var arr=str.split('');
var newarr=unique(arr);
var newstr=newarr.join('');
return newstr;
}
var str='adsdsdwesdsdds';
console.log(strUnique(str));
求字符串出现的次数最多的字符次数
1 var str='asdsdkdsksdlsldlsassss';
var temp={};
str.replace(/\w{1}/g,function(val){
temp[val]?temp[val]++:temp[val]=1;
})
String.prototype.split.call(temp,',')
console.log(temp);
2 var obj={};
var max;
var letter;
for (var i=0;i<str.length;i++ )
{
if(obj[str[i]]){
obj[str[i]]++;
if(obj[str[i]]>max){
max=obj[str[i]];
letter=str[i];
}
}
else{
obj[str[i]]=1;
max=obj[str[i]];
letter=str[i];
}
}
console.log(letter+":"+obj[letter]);
console.log(obj);
3 var str1=str.split('');
str1.sort();
str=str1.join('');
var reg=/(\w)\1*/g;
var arr=str.match(reg);
console.log(arr);
arr.sort(function(a,b){
return a.length<b.length
})
console.log(arr[0][0]+':'+arr[0].length)
解析url将参数放在对象中
function parseUrl(url){
var obj={};
var val=url.split('?')[1];
if(val!=null){
var arr=val.split('&');
for(var i=0;i<arr.length;i++){
var keyArr=arr[i].split('=');
obj[keyArr[0]]=keyArr[1];
}
}
return obj;
}
var url='https://www.baidu.com?key=1&name=cx&age=12';
console.log(parseUrl(url));
随机产生10个在1-100之间的数 并排序
var arr1=Array(10).join(",").split(",")
.map(function(elem,index,arr){
return Math.ceil(Math.random()*100+1);
});
arr1.sort(function(a,b){
return a<b;
})
js实现二分法
function binarySearch(items,value){
var startindex=0;
var stopIndex=items.length-1;
var middle=Math.floor((startindex+stopIndex)/2);
while(items[middle]!=value&&startindex<stopIndex){
if(value<items[middle]){
stopIndex=middle-1;
}
else if(value>items[middle]){
startindex=middle+1;
}
middle=Math.floor((startindex+stopIndex)/2);
}
return (items[middle]!=value)?-1:middle;
}
js快速排序
function quickSort(arr){
if(arr.length<=0){
return arr;
}
var index=Math.floor(arr.length / 2);
var cur=arr.splice(index,1);
var left=[];
var right=[];
for(var i=0;i<arr.length;i++){
if(cur>arr[i]){
left.push(arr[i]);
}else if(cur<arr[i]){
right.push(arr[i]);
}
}
return quick(left).concat(cur,quick(right));
}
AngularJs
Angular 应用:用带 Angular 扩展语法的 HTML 写 模板 , 用 组件 类管理这些模板,用 服务 添加应用逻辑, 并在 模块 中打包发布组件与服务
钩子
ngOnChanges
当 Angular (重新)设置数据绑定输入属性时响应。 该方法接受当前和上一属性值的 SimpleChanges 对象,
当被绑定的输入属性的值发生变化时调用,首次调用一定会发生在 ngOnInit 之前。
ngOnInit
在 Angular 第一次显示数据绑定和设置指令 / 组件的输入属性之后,初始化指令 / 组件。
在第一轮 ngOnChanges 完成之后调用,只调用 一次 。
ngDoCheck
检测,并在发生 Angular 无法或不愿意自己检测的变化时作出反应。
在每个 Angular 变更检测周期中调用, ngOnChanges 和 ngOnInit 之后。
ngAfterContentInit
当把内容投影进组件之后调用。
第一次 NgDoCheck 之后调用,只调用一次。
只适用于组件 。
ngAfterContentChecked
每次完成被投影组件内容的变更检测之后调用。
ngAfterContentInit 和每次 NgDoCheck 之后调用
只适合组件 。
ngAfterViewInit
初始化完组件视图及其子视图之后调用.
第一次 ngAfterContentChecked 之后调用,只调用一次。
只适合组件 。
ngAfterViewChecked
每次做完组件视图和子视图的变更检测之后调用。
ngAfterViewInit 和每次 ngAfterContentChecked 之后调用。
只适合组件 。
ngOnDestroy
当 Angular 每次销毁指令 / 组件之前调用并清扫。 在这儿反订阅可观察对象和分离事件处理器,以防内存泄漏.
在 Angular 销毁指令 / 组件之前调用。
Angular 2 : Template Driven Forms
import { Component } from '@angular/core';
import { Router , ROUTER_DIRECTIVES} from '@angular/router';
import { NgForm } from '@angular/forms';
@Component({
selector: 'login',
template: `
<h2>Login</h2>
<form #f="ngForm" (ngSubmit)="login(f.value,f.valid)" novalidate>
<div>
<label>Username</label>
<input type="text" [(ngModel)]="username" placeholder="enter username" required>
</div>
<div>
<label>Password</label>
<input type="password" name="password" [(ngModel)]="password" placeholder="enter password" required>
</div>
<input class="btn-primary" type="submit" value="Login">
</form>`
//For long form we can use **templateUrl** instead of template
})
export class LoginComponent{
constructor(private router : Router){ }
login (formValue: any, valid: boolean){
console.log(formValue);
if(valid){
console.log(valid);
}
}
}
One way binding from parent component to nested component: [propertyName]
One way binding from nested component to parent component: (propertyName)
Two-way binding (a.k.a banana box notation) : [(propertyName
)]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。