计算和删除javascript数组中的重复项

时间:2015-01-15 06:01:13

标签: javascript arrays

我有一组正整数。有些是独特的,有些是重复的。我试图创建一个能够计算重复数量并将其与相关数字配对的函数。

例如,如果我开始使用此数组:

arr = [89, 1, 1, 2, 89, 89];

我试图将结果作为结果:

res = [
       {"id" : 1, "count" : 2 },
       {"id" : 2, "count" : 1 },
       {"id" : 89, "count" : 3 }
      ];

这是我编写的功能,但它不起作用,我觉得这是一个更好的解决方案:

    function cons_dupes(arr) {
    //Consolidate duplicates by deleting everything but one of each.
    //Also adds a count of total duplicates with each index.
    var out = {};

    for (i=0;i<arr.length;i++)
    {
        if (arr[i] !== 'null') 
        {

            out[i] = {
                data: arr[i],
                count: 1
            };

            for (ii=0; ii<arr.length; ii++) 
            {
                if (arr[i]==arr[ii])
                {
                    arr[ii] = 'null';
                    out[i].count++;
                }
            }
        }
        else
        {
        console.log('null value: arr['+ii+']');
        }
    }

    return out;
}

非常感谢任何帮助!

5 个答案:

答案 0 :(得分:3)

您可能希望分两步完成:1)创建一个包含每个id计数的对象,然后2)创建最终的对象数组。例如:

var a = [89, 1, 1, 2, 89];
var counts = {};
var final = [];

for (var i = 0; i < a.length; i++) {
    if(counts[a[i]] != undefined) {
        counts[a[i]] = 1;
    } else {
        counts[a[i]]++;
    }
}

for (var num in counts) {
    final.push({'id': num, 'count': counts[num]});
}

// final has what you want here

答案 1 :(得分:2)

请注意您的for (ii=0; ii<arr.length; ii++)不正确,因为您不应该计算arr[i] == arr[i]。将此行更改为for (ii=i + 1; ii<arr.length; ii++)将使您的功能正常运作。

这是我的解决方案:

function cons_dupes(arr) {
  var p = {};
  arr.forEach(function (x) { p[x] = (p[x] || 0) + 1; });
  return Object.keys(p).map(function (x) { return { id: x, count: p[x] }; });
}

答案 2 :(得分:0)

如果你不介意使用http://underscorejs.org/,这是一个简单的解决方案:

_.map(_.groupBy(arr), function(value, key) {
  return {
    id: key,
    count: value.length
  }
});

答案 3 :(得分:0)

arr = [89, 1, 1, 2, 89, 89];
arr.sort();//it alters the orignal array. so beware
var newArr = [];
var count = 1;
for (i = 0; i<arr.length; i++){
    if(arr[i] == arr[i+1]){
        count ++;
        continue;
    } else {
        newArr.push({
            id: arr[i],
            count: count
        });
        count = 1;
    }
}
alert(JSON.stringify(newArr));//newArr holds the data u want

我会做这样的事情。但必须有更好的答案

答案 4 :(得分:0)

你有&#34; 计算和删除javascript数组中的重复项&#34;在主题中但你没有提到在问题正文中删除。您应该确保问题正文完整,并且不依赖于标题中的信息,并且标题与正文相符。

此处的大多数答案都不会删除重复项。

无论如何,假设您想要删除成员数量和重复数据,您可以执行以下操作:

// Removes duplicates from an array and returns an object
// with a count of the members
function removeDupes(arr) {
  var result = {};
  var i = arr.length;

  while (i--) {

    // If member is a duplicate, increment count and delete it      
    if (result.hasOwnProperty(arr[i])) {
      result[arr[i]]++;
      arr.splice(i, 1);

    // Otherwise, just add it to the results 
    } else {
      result[arr[i]] = 1;
    }
  }

  // convert results to the desired object format
  return Object.keys(result).map(function (p){return {id: p, count: result[p]};});
}