JavaScript 数组的 uniq 方法
FROM http://realazy.org/blog/2007/12/07/uniq-method-for-js-array/
来自某个nb招聘的题目:
请给Array本地对象增加一个原型方法,它的用途是删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。这是我的答案:
新解
Array.prototype.uniq = function(){
var resultArr = [],
returnArr = [],
i = 1,
origLen = this.length,
resultLen;
function include(arr, value){
for (var i=0, n=arr.length; i<n; ++i){
if (arr[i] === value){
return true;
}
}
return false;
}
resultArr.push(this[0]);
for (i; i<origLen; ++i){
if (include(resultArr, this[i])){
returnArr.push(this[i]);
} else {
resultArr.push(this[i]);
}
}
resultLen = resultArr.length;
this.length = resultLen;
for (i=0; i<resultLen; ++i){
this[i] = resultArr[i];
}
return returnArr;
}
这种解法在整个过程对原有数组的改变只有两次,效率比其他两种高了2个数量级左右!可在此测试三种解法的性能。
旧解
以下至“关于测试案例”之间皆为旧文,若阅读不顺,忽略之。
Array.prototype.uniq_slow = function(){
var ret = [],
i = 0,
j = 0;
while (undefined !== this[i]){
j = i + 1;
while(undefined !== this[j]){
if (this[i] === this[j]){
ret.push(this.splice(j, 1)[0]);
} else {
++j;
}
}
++i;
}
return ret;
}
感谢猫仔提示,这道题目很容易让人产生误读。看清了题目后更新了。
为何用 while 而不是 for? 因为这个数组总是在变化,每次循环都得重新计算 length. 按理说,使用 while 效率会更高,尤其数组很大的时候。
欢迎大家交流讨论。
感谢 fdcn 提示,更新之。这里确实是容易犯错。
猜想由于强类型判断导致性能不高(可在此测试),因此此种做法未见有性能的提升(还稍微慢了一些),而且还不能传递类似 [1,,,2,,] 这样的数组。所以还是淘宝UED上的解法比较科学(当然不是没有改进之处,比如不应该在 for 循环中声明变量)。
其实,这篇blog的意义在探讨如何避免无意义的消耗(比如计算 length)。但是鱼和熊掌不能兼得是自古之理,顾此失彼。当然,办法不是没有,比如数组的 forEach, map 方法等,可惜只有 gecko 浏览器才支持。
关于测试案例
数组是随机产生的1-100之间的整数,长度为5000,每个相同的大约重复5次。三个测试数组的元素构成是一致的。
总结
对数组的改变开销巨大,如果可能,尽量在不改变原有数组的情况下进行操作,如最终需要改变数组自身,可将结果赋予原有数组来操作。另外,对于 length 的计算,似乎效率并未受其影响。
啥时候我也该进补算法了,唉。软肋啊。
推荐阅读: 王元涛同学的 JavaScript 数组的 uniq 方法。
另一种实现: FROM http://freeman983.iteye.com/blog/163799
2008-02-21
JavaScript 数组的 uniq 方法
Array.prototype.uniq_freeman983 = function(){
window.status='freeman983';
var oa = this;
var ya = new Object();
var ra = [];
for(var i = 0; i < oa.length; i++ ){
var temp=oa[i];
if(ya[temp]){
ra.push(temp);
}else{
ya[temp]=temp;
}
}
return ra;
}
分享到:
相关推荐
本文将深入探讨如何有效地更新JavaScript数组中的`uniq`方法,并通过具体的代码示例来分析不同实现方式的优缺点。 #### 二、问题背景 在JavaScript中,原生并没有提供直接去除数组重复项的方法。因此,开发者通常...
本文将对现有的几种JavaScript数组去重方法进行总结和分析,帮助读者更好地理解各种方法的原理、优势和潜在的性能问题。 1. 第一种方法:使用indexOf()方法 第一种方法是通过创建一个新的数组,遍历原数组,并使用...
总之,JavaScript中删除数组重复项的方法多种多样,可以根据具体需求选择最合适的实现。考虑到兼容性和性能,使用`Array.indexOf()`和自定义`indexOf`方法相结合的策略是一种常见的做法。在处理复杂类型的数组时,...
下面我们将深入探讨JavaScript数组的一些关键知识点。 1. **创建数组**: - `new Array()` 创建一个空数组。 - `new Array(size)` 创建指定长度的数组,但数组的实际大小仍可变。 - `new Array(element0, ...
### 知识点一:JavaScript数组去重的重要性与应用场景 在进行JavaScript开发时,数组去重是一个常见的需求,尤其是在处理用户输入或从外部接口获取数据时。由于数据来源复杂,原始数组可能会包含重复的元素。这些...
总之,`uniq`函数是解决JavaScript数组去重问题的一个重要工具。理解并掌握这些去重方法,对于提升JavaScript编程能力大有裨益。在实际应用中,可以根据具体情况选择最合适的方法,确保代码的高效性和可维护性。
本题目的目标是为JavaScript的Array对象添加一个新的原型方法,名为`delRepeat`,这个方法会移除数组中的重复条目,并返回一个包含所有被删除的重复条目的新数组。 首先,让我们深入理解题目需求。假设我们有一个...
除了去重,还可以探索更多JavaScript数组操作(如`map`, `filter`, `reduce`等)、遍历算法、数学运算、数据结构、查找算法、切换特效、动画特效以及错误调试等方面的技巧,不断拓展自己的JavaScript知识体系。
以下,我们将根据提供的文件内容,详细总结常见的JavaScript数组去重方法,并解释每个方法的原理和使用场景。 ### 普通方法去重 #### 1. 简单的去重方法 这是一种基础的去重方法,通过创建一个新数组,遍历原数组...
首先,让我们了解JavaScript数组的一些基本特性。数组是一种有序的数据集合,可以存储各种类型的值,包括数字、字符串、对象等。在JavaScript中,数组的去重可以通过多种方法实现,主要包括: 1. **使用Set对象**:...
如果允许使用第三方库,lodash的uniq方法非常方便。 ```javascript const _ = require('lodash'); function unique(arr) { return _.uniq(arr); } ``` 以上12种方法各有优缺点,例如Set和Map在处理复杂类型...
"你可以使用原生ESLint插件的JavaScript方法列表.zip"这个资源可能包含了一个详细列表,列出了JavaScript中可以替代lodash和underscore库的一些原生方法。这些库通常被用来提供各种实用函数,如数组操作、对象处理、...
在JavaScript编程中,处理数组并确保其元素不重复是一项常见的任务。YAHOO.util.YUILoader类中的一个方法提供了一种巧妙的解决方案,通过将数组转换为对象来去除重复项。这种方法利用了JavaScript对象的键不可重复性...
此外,文章还推荐了《JavaScript数组操作技巧总结》、《JavaScript排序算法总结》等专题,以便读者在进一步深入学习JavaScript时参考。 总结来说,通过利用JavaScript对象key值的唯一性,我们能高效地实现数组去重...