javscript巧用对象特性去掉数组重复项并排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javscript巧用对象特性去掉数组重复项并排序相关的知识,希望对你有一定的参考价值。

当有一个数组a=[1,2,3,4],还有一个对象a={0:1,1:2,2:3,3:4},然后运行alert(a[0]),两种情况下的运行结果都是1,这就是说,数据集合既可以用数组表示,也可以用对象表示!但是我们是无法定义一个具有两个相同key值的object,而我们正可以利用这种特性来去掉数组中的重复项。

  • 把数组转成一个js对象
  • 把数组中的值变成对象中的key
  • 把对象还原成数组
//把数组转成一个js对象
function toObj(arr){
    var obj = {};
    for(var i=0;i<arr.length;i++){
        obj[arr[i]] = true;
    }
    return obj;
}
function objkeys(obj){
    var arr = [];
    for(var attr in obj){
        if(obj.hasOwnProperty(attr)){  //使用hasOwnProperty比较严谨
            arr.push(attr);
        }
    }
    return arr;
}
function uniq(arr){
    return objkeys(toObj(arr));
}
var arr1 = [4,5,2,56,56,54,4,4,2,9,10]
alert(uniqSort(arr1));        //2,4,5,9,10,54,56

我们发现用这种方法不但可以给去重而且还可以排序,一举两得!

上面提到的hasOwnProperty方法说明下:

javascript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。 使用方法:
object.hasOwnProperty(proName)
其中参数object是必选项。一个对象的实例。
proName是必选项。一个属性名称的字符串值。

如果 object 具有指定名称的属性,那么JavaScript中hasOwnProperty函数方法返回 true;反之则返回 false。此方法无法检查该对象的原型链中是否具有该属性;该属性必须是对象本身的一个成员。在下例中,所有的 String 对象共享一个公用 split 方法。下面的代码将输出 false 和 true。 
var s = new String("JScript");

print(s.hasOwnProperty("split"));

print(String.prototype.hasOwnProperty("split"));

另外在说一下其它我们常用的方法的思路

1.构建一个新的数组存放结果

2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比

3.若结果数组中没有该元素,则存到结果数组中

-------------------

1.先将原数组进行排序

2.检查原数组中的第i个元素 与 结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置

3.如果不相同,则将该元素存入结果数组中

-------------------

1.创建一个新的数组存放结果

2.创建一个空对象

3.for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为1,存入到第2步建立的对象中

  • 上面的方法代码就不展示了,百度都有,第二种方法有局限性在于它打破了数组原先的排序!

以上是关于javscript巧用对象特性去掉数组重复项并排序的主要内容,如果未能解决你的问题,请参考以下文章

JS去除数组中重复的数字

JavaScript 对象数字键特性实现桶排序

删除重复项并模拟 group_concat 对结果进行排序

巧用php中的array_filter()函数去掉多维空值

去掉数组中重复的数字

在 Bigquery 中使用结构数组删除重复项并选择不同的值