Q:有一数组如下:

arr[
{
ID:123,
name:"jackket"
},
{
ID:132,
name:"jacket"
},
{
ID:123,
name:"tom"
}
]

,用一算法去除ID同样的元素,保留其中一个,输出最后的数组。

function removeSameID(obj){
var _arr = [];
_arr.push(obj[0]);
for(var i=0;i < obj.length;i++){
var _num = 0;
for(var j=0;j < _arr.length;j++){
if(obj[i].ID != _arr[j].ID){
_num ++;
}
if(_num == _arr.length){
_arr.push(obj[i]);
}
}
}
return _arr;
}

注:上面用到了underscore.js插件。

不过,上面算法复杂度是N的二次方,如果数据相对较少那还可以忽略执行时间,但是数据一旦非常大,显然执行效率是非常差的,于是想到了另外一种解决思路,改进代码如下:

function removeSameID(arr){
var O = {};
var output =[];
_.each(arr,function(o){
O[o.ID] = o;
});
for(var n in O){
output.push(O[n]);
}
return output;
}

很明显,上面这种算法复杂度仅仅为N,执行时间大幅度减少。
通过这一个小小的需求,感悟就是:不论是java,c#,还是js,还是其它任何语言,最根本的还是算法,基础有多好,决定了能站多高。