javascript实现数组元素去重

如题,这算是一个比较经典的面试题了吧.在日常开发中也会经常遇到.研究一下还是很有价值的,让我们剖析一下.

随意定义一个数组,比如

1
var arr = [1,2,2,3,4];

arr[1]和arr[2]都为2,我们只保留一个。

在解决这个问题之前我们了解一下一种结构叫做”哈希表”,类似这种:

1
2
3
4
5
var hash_example = {
"百度" :"http://www.baidu.com/",
"Google" :"http://www.google.com/",
"微软" :"http://www.microsoft.com/"
};

怎么样,并不陌生吧,我们最熟悉的键值对形式。刚才那个arr数组有五个元素,我们可以给他对应的做一个五个元素的hash表,让他的每个元素作为hash表的”键”,这样:

1
2
3
4
5
6
7
var hash_example = {
1 : " ",
2 : " ",
2 : " ",
3 : " ",
4 : " "
};

在hash_example中有两个重复的项。我们如果把每个键的值用true和false表示,第一次粗现就标记为true,第二次就标记为false,我们只需要去掉键值为false的项,然后把存下来的键放到数组里就ok了。

1
2
3
4
5
6
7
var hash_example = {
1 : true,
2 : true,
2 : false,
3 : true,
4 : true
};

利用这个原理,我们首先定义一个空数组来存放去重之后的结果

1
var newArr = [];

然后定义一个hash表结构

1
var hash = {};

遍历数组,构建哈希表,并得出新数组

1
2
3
4
5
6
for(var i=0;i<arr.length;i++){
if(!hash[arr[i]]){
newArr.push(arr[i]);
hash[arr[i]] = true;
}
}

大功告成。

西泊浪人©blog.western-ranger.com

git的基本用法

之前一直是用gitextension开发,图形化界面的好处就是简单易懂,现在可能我水平还不够,不能够说出他很多坏处,至于现在我开始放弃使用git的图形化界面完全是因为现在的公司,现在的工作开发仓库用git,所以平时也就联系一下使用git命令行呗。

使用git命令好处还是有的。这练着练着就觉得git的命令行方式确实比较高端,首先看着高端,毕竟要记住好多命令嘛,装个逼。。哈哈。其次,用命令行基本不会出行卡机的现象,用过gitextension的都知道那个软件经常会卡。然后我记得第一次拉去git项目必须用命令行吧。用git extension拉取不下来。命令行的好处就体现出来了。最重要的是,如果你能把git的命令掌握的很熟练的话,操作起来肯定比用图形化界面快。

经过这几天的摸索,现在总结学到的基本命令:

克隆档案库:

1
git clone 【github上的那个https或者ssh地址】;

添加,新添加文件要提交,首先:

1
git add --all;

提交本地档案库,都加上之后再:

1
git commit -a

如果没有新添加的文件,直接运行此命令;

查看分支状态

1
git status

从这里可以看出那些文件没提交,哪些问价是新添加的;

提交远程档案库

1
git push

这样,你就可以从另一台电脑上访问github查看你在别的电脑上提交的代码了;

拉取代码

1
git pull

新建分支

1
git branch 【分支名字】;

切换分支

1
git checkout [分支名字]

注意切换之前必须在本地提交代码;

把分支加入远程端

1
git remote add [远程服务器端名字,随便起一个名字][github上的那个https或者ssh地址];

推送新分支到github上

1
git push [远程服务器端名字][分支名字];

查看最近操作记录

1
git log

js重复绑定事件

昨天被自己绑定click事件坑了一下子,学浅乃危险之事。如果读书多了就不会犯这样的错误了。

这样一个下拉框,点击”我选1”会生成一条”hello world!!!”,点”继续添加”则会继续添加,一次生成一条。如果点击”我选2”也会像之前一样,首先把之前的记录清除掉,再生成一条,可以继续添加。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var nodeArea = '<div class="moOrRanArea" style="border:#000 solid 1px;margin:10px 0;">\
hello world!!!\
</div>';
$("#moOrRan").change(function(){
if(this.value!=0){
$(".externalArea .moOrRanArea").remove();
$(".externalArea").show().append($(nodeArea));
$("#addArea").bind("click",function(){
$(".externalArea").append($(nodeArea));
})
}else{
$(".externalArea").hide();
$(".externalArea .moOrRanArea").remove();
}
})

看起来没啥问题,但是实际运行是有问题的,从”我选1”切换到”他选二”,刚切换过去是这样的:我点一次”继续添加”就成这样了:点击一次,增加了两条!!!

我考虑了半天。。。然后打断点各种试,发现

1
2
3
$("#addArea").bind("click",function(){
$(".externalArea").append($(nodeArea));
})

从”我选1”切换到”他选2”的时候,每点击一次继续添加,这段代码执行了两边。原来是”$(“#addArea”)”,这个dom元素添加了两次click事件。

解决方案:

1
$("#addArea").unbind("click").bind("click",function(){...})

首先绑定unbind就搞定。

sass的安装使用

用scss来书写css还是很方便的。首先是ruby的下载与安装,下载地址是http://rubyinstaller.org/downloads/ 。下载完以后,我们打开安装文件,点击下一步安装即可,注意 在这里下面打上勾,防止以后运行命令的时候找不到。

安装完成后,点击后打开。运行命令

1
gem install sass

然后等待安装完成,第一次安装可能会花费时间比较长,也有可能是被屏蔽了,多试几次就可以。

下一步我们安装compass,运行命令

1
gem install compass

然后也是等待安装。安装完成后 运行 sass -vcompass -v。表明已经安装成功。

对于使用,比如你新建一个项目叫test在e盘下, 首先进入e盘的test里。 然后我们在test中建一个文件夹用来存放css样式 , 用命令

1
compass create style

点回车,会生成一大堆代码,style文件就建好了,style文件夹里生成了这几个文件:

然后接着上面的黑框输入如下内容 表明监听成功,然后就可以在sass文件夹下的文件里写样式了(比如在ie.scss里)。

引用样式还是引stylesheets文件夹下的css文件,比如

1
<link style="stylesheet" href="style/stylesheets/ie.css">