`
bluky999
  • 浏览: 719783 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JavaScript 数组的 uniq 方法

阅读更多
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 更新 JavaScript 数组的 uniq 方法

    本文将深入探讨如何有效地更新JavaScript数组中的`uniq`方法,并通过具体的代码示例来分析不同实现方式的优缺点。 #### 二、问题背景 在JavaScript中,原生并没有提供直接去除数组重复项的方法。因此,开发者通常...

    javascript数组去重的方法汇总

    本文将对现有的几种JavaScript数组去重方法进行总结和分析,帮助读者更好地理解各种方法的原理、优势和潜在的性能问题。 1. 第一种方法:使用indexOf()方法 第一种方法是通过创建一个新的数组,遍历原数组,并使用...

    javascript 删除数组中重复项(uniq)

    总之,JavaScript中删除数组重复项的方法多种多样,可以根据具体需求选择最合适的实现。考虑到兼容性和性能,使用`Array.indexOf()`和自定义`indexOf`方法相结合的策略是一种常见的做法。在处理复杂类型的数组时,...

    javascript 数组学习资料收集

    下面我们将深入探讨JavaScript数组的一些关键知识点。 1. **创建数组**: - `new Array()` 创建一个空数组。 - `new Array(size)` 创建指定长度的数组,但数组的实际大小仍可变。 - `new Array(element0, ...

    详解javascript数组去重问题

    ### 知识点一:JavaScript数组去重的重要性与应用场景 在进行JavaScript开发时,数组去重是一个常见的需求,尤其是在处理用户输入或从外部接口获取数据时。由于数据来源复杂,原始数组可能会包含重复的元素。这些...

    js代码-uniq 函数,实现数组去重

    总之,`uniq`函数是解决JavaScript数组去重问题的一个重要工具。理解并掌握这些去重方法,对于提升JavaScript编程能力大有裨益。在实际应用中,可以根据具体情况选择最合适的方法,确保代码的高效性和可维护性。

    删除数组条目中重复的条目(可能有多个),返回值是一个仅包含被删除的重复条目的新数组。

    本题目的目标是为JavaScript的Array对象添加一个新的原型方法,名为`delRepeat`,这个方法会移除数组中的重复条目,并返回一个包含所有被删除的重复条目的新数组。 首先,让我们深入理解题目需求。假设我们有一个...

    JavaScript基于对象去除数组重复项的方法

    除了去重,还可以探索更多JavaScript数组操作(如`map`, `filter`, `reduce`等)、遍历算法、数学运算、数据结构、查找算法、切换特效、动画特效以及错误调试等方面的技巧,不断拓展自己的JavaScript知识体系。

    js数组去重的方法总结

    以下,我们将根据提供的文件内容,详细总结常见的JavaScript数组去重方法,并解释每个方法的原理和使用场景。 ### 普通方法去重 #### 1. 简单的去重方法 这是一种基础的去重方法,通过创建一个新数组,遍历原数组...

    js数组去重-duplicateRemoval

    首先,让我们了解JavaScript数组的一些基本特性。数组是一种有序的数据集合,可以存储各种类型的值,包括数字、字符串、对象等。在JavaScript中,数组的去重可以通过多种方法实现,主要包括: 1. **使用Set对象**:...

    高性能js数组去重(12种方法,史上最全)

    如果允许使用第三方库,lodash的uniq方法非常方便。 ```javascript const _ = require('lodash'); function unique(arr) { return _.uniq(arr); } ``` 以上12种方法各有优缺点,例如Set和Map在处理复杂类型...

    你可以使用原生ESLint插件的JavaScript方法列表.zip

    "你可以使用原生ESLint插件的JavaScript方法列表.zip"这个资源可能包含了一个详细列表,列出了JavaScript中可以替代lodash和underscore库的一些原生方法。这些库通常被用来提供各种实用函数,如数组操作、对象处理、...

    js 巧妙去除数组中的重复项

    在JavaScript编程中,处理数组并确保其元素不重复是一项常见的任务。YAHOO.util.YUILoader类中的一个方法提供了一种巧妙的解决方案,通过将数组转换为对象来去除重复项。这种方法利用了JavaScript对象的键不可重复性...

    JS基于对象的特性实现去除数组中重复项功能详解

    此外,文章还推荐了《JavaScript数组操作技巧总结》、《JavaScript排序算法总结》等专题,以便读者在进一步深入学习JavaScript时参考。 总结来说,通过利用JavaScript对象key值的唯一性,我们能高效地实现数组去重...

Global site tag (gtag.js) - Google Analytics