Javascript:编写一个接收数组的函数,然后返回一个只包含唯一数字的数组,只删除数组

时间:2016-04-21 02:00:30

标签: javascript arrays duplicates key

编写一个接收列表的函数,并返回一个列表,其中删除了所有重复项(列表只有唯一的数字)。

这是我到目前为止所拥有的:

       var lista = [1,4,5,1,1,3,5,6,4,4,3];

      function dupRemove (lista) {
           //Sort the array in case it isn't sorted
           lista.sort();
           //Object to store duplicates and unique numbers
           var listNumbers = {
             "Duplicate Numbers": [],
             "Unique Numbers": []
           };
           for (var i = 0; i < lista.length; i++) {
             //check if it is not equal to the index of the array before it and after. if it isn't, that means its unique, push it in the uniques array.
             if (lista[i] !== lista[i-1] && lista[i] !== lista[i+1]) {
               listNumbers["Unique Numbers"].push(lista[i]);
             } else {
               listNumbers["Duplicate Numbers"].push(lista[i]);
             }
           }
           return listNumbers;
         }

目前,我的解决方案返回一个对象,其键值为“Duplicates”:1,1,1,3,3,4,4,4,5,5和“Uniques”:6。

如何从重复项中删除重复项,然后将这两个键连接到一个数组中?

谢谢。

3 个答案:

答案 0 :(得分:1)

答案严重过度 - 只需要将所有值推送到新数组(如果它们尚未包含在内)。

function=removeDups()
{
   var lista = [1,4,5,1,1,3,5,6,4,4,3];
   var uniqueValues=[];
   var duplicateValues=[];
   for(i=0;i<lista.length;i++)
     {
       if(uniqueValues.indexof(lista[i] == -1){uniqueValues.push(lista[i]}else{duplicateValues.push(lista[i]}
     }
}

答案 1 :(得分:0)

您可以使用所有阵列上的默认过滤器方法

您也不需要排序功能。如果已使用indexOf方法找到该项,则不会将其添加到由过滤器方法创建的新返回的数组中

&#13;
&#13;
var list = [1,4,5,1,1,3,5,6,4,4,3];

function removeDup (arr) {
   return arr.filter(function(item, pos) {
      return arr.indexOf(item) == pos;
 })
}

var sortedList = removeDup(list).sort(function(a,b){
  return  a - b
})

document.getElementsByTagName('div')[0].textContent = sortedList
&#13;
<div></div>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

一种非优雅的解决方案,但它为您提供了两个数组:一个具有重复值,另一个具有唯一值。由于你不能依赖.sort(),你可以算一些事情。

函数checkList将返回这两个数组。

var list = [1,4,5,1,1,3,5,6,4,4,3];

console.log(checkList(list));

function checkList(list) {
    var uniques = []; // will be [6]
    var dups = []; // will be [1, 4, 5, 3]
    var checked = []; // save what you have already checked so far

    for(i = 0; i < list.length; i++) {
        if(notChecked(list[i], checked)) {
            checked.push(list[i]);
            if(count(list[i], list) > 1) {
                dups.push(list[i]);
            } else {
                uniques.push(list[i]);
            }
        }
    }
    return {dups: dups, uniques: uniques}
}

// count how many num in arr
function count(num, arr) {
    var count = 0;
    var i;
    for(i = 0; i < arr.length; i++) {
        if(arr[i] == num) count++;
        if(count > 1) return count;
    }
    return count;
}
// check if num has not been checked
function notChecked(num, arr) {
    return (arr.indexOf(num) == -1) ? true : false;
}