javascript 从去重到排序的考量

写这篇文章的原因是因为在某个简单的问题上翻船,往往高手和新手的区别就在于看似平常的地方,一直以来都在思考高手和新手的本质区别,高手绝非工作经验和工作时间的堆积造就的,10年工作经验的人也许是1年工作经验用了十年也不一定。

这里有一道题目,是这样:数组去重、并按倒数第二个字母排序

这个问题实在是非常简单
去重:定义一个新的数组,取出原数组的元素,依次放入新的数组,放入之前需要检查是否在新的数组已经存在即可。
排序:使用数组的sort()方法,javascript 默认使用冒泡排序,只需要传入2个元素的比较结果即可,按照题目,只需要取出字母,然后比较即可。
于是得到代码:

function uniqe(arr){
var tmp = {};
var result = [];
for(var i = 0,len = arr.length;i < len;i ++){
    var item = arr[i];
    if(item in tmp){
        continue;
    }
    result.push(item);
}
return result.sort(function(a,b){
    return a.charCodeAt(a.length-2) - b.charCodeAt(b.length-2);
});

}

var arr =['hello','world','nodejs','javascript',
'html','world','css','flash','adobe','java','hello'];
uniqe(arr)

那么我们把这个问题继续简化!!数字数组去重、并排序。
看这个问题是否更加简单?但是等等,这种基础函数,一般都需要承载丰富的业务逻辑,被大量引用,也许是在循环等复杂的逻辑中,因此要求足够健壮、高效。我们不仅需要检查输入还需要选择更好算法,解决这个问题的思路应该是:step1 排序 setp2 查找 step3 去重

more >>

Qunit 中文文档

1、官方文档地址

http://qunitjs.com/cookbook/#asserting-results

Introduction 简介

Automated testing of software is an essential tool in development. Unit tests are the basic building blocks for automated tests: each component, the unit, of software is accompanied by a test that can be run by a test runner over and over again without any human interaction. In other words, you can write a test once and run it as often as necessary without any additional cost.

In addition to the benefits of good test coverage, testing can also drive the design of software, known as test-driven design, where a test is written before an implementation. You start writing a very simple test, verify that it fails (because the code to be tested doesn't exist yet), and then write the necessary implementation until the test passes. Once that happens, you extend the test to cover more of the desired functionality and implement again. By repeating those steps, the resulting code looks usually much different from what you'd get by starting with the implementation.

Unit testing in JavaScript isn't much different from in other programming languages. You need a small framework that provides a test runner, as well as some utilities to write the actual tests.

 

    自动化的测试软件在开发中是必备的。单元测试将会为自动化测试创建一些基本的代码块:组件、单元,伴随着不需要人工的干预,一次一次的重复运行的测试程序。总之,你能编写一次测试就能在必要的时候再次运行而不用再次编写。

   额外的好处就是代码运行的覆盖测试,同时测试也能驱动软件更好的设计,就像著名的测试驱动开发,在实现之前写一个测试,你甚至可以写一个简单的测试,然后测试失败(因为现在代码仍然没有开始编写),然后开始实现你的代码直到你的测试通过。你能够拓展你的测试去覆盖更多的需求和功能,并且再次扩充你的实现代码。通过重复这些步骤,最终你得到的代码看起来常常和你最初开始实现的代码大为不同。

   Javasscript 的单元测试和其他计算机编程语言来说非常不同。因此你需要一个小的测试框架来运行你的测试用例,同时也作为一组编写单元测试的工具。

more >>

一句话扯扯数据结构的概念点

数据结构的很多概念真的是很莫名其妙,很多坑爹的定义,笔者开始很搞不明白,为什么学数据结构?为什么用哪个拗口词语?这些概念到底用在什么地方?笔者试图用自己简单的话来阐述这些问题,希望能对这些感觉不是很好理解的同学有帮助。如有错误,欢迎指正!email:linksgo2011@gmail.com

  数据结构是算法的基石,算法是软件灵魂。

  不废话,直接开始。

  一、概论

   时间复杂度:就是算法实现的执行的时间,说白了就是程序套了好多循环。没有就是o(n),2层循环就是o(n2),如此,剩下就不要管了。

   空间复杂度:说白了就是你定义了好多的变量,程序执行是额外使用了好多冗余内存。

   算法标准:什么算法是好的算法?好用就行。1、正确2、简单 3、占内存少 4、速度快 ,这几点不可兼得,自己把握,其实能简单和速度是主要的。

   二、线性表

    顺序存储结构 连续的存储

    

    链式存储结构      内存中随机存储的,只需要指针写出下一个结点在哪里即可

    线性表:逻辑上不分叉就行。一个个数据元素前后相连(就是前驱、后继)。数据项平等对待。与此相对就是数、图。用途:其实就是数组啦。

    链表:采用链式存储方式的线性表。什么是链式存储?就是一个数据项中不仅保存数据还要告诉下一个数据在哪里。用途:数据大小不确定时用。

    从普通链表拓展的概念:

    1、循环链表:首尾相连的链表;

    2、双链表:前后相随的链表;前< >后

      用途:特殊情况加快链表的操作;

more >>

从cnblog 到 Typecho

cnblog 已经用了2年,cnblog的缺陷和不足是无法托管DEMO和已经完善的组件产品,看着我写的DEMO散落一地,不忍丢弃所以切换到独立博客,如果有好的作品也可以与大家分享。cnblog 地址 http://www.cnblogs.com/linksgo2011

今天是2014年最后一天,恰好生日,留在公司谢了新博客的第一篇博文,cnblog是刚刚工作就开始写,如今已经2年3个月了,工作了这么久也没留下什么优秀的作品和文章,从typeho开始算是告别过去,迎接未来吧。
2015与君共勉。

more >>