【问题标题】:How to count duplicate value in an array in javascript如何在javascript中计算数组中的重复值
【发布时间】:2013-10-24 02:03:39
【问题描述】:

目前,我得到了一个这样的数组:

var uniqueCount = Array();

几个步骤后,我的数组是这样的:

uniqueCount = [a,b,c,d,d,e,a,b,c,f,g,h,h,h,e,a];

如何计算数组中有多少个 a、b、c?我想要这样的结果:

a = 3
b = 1
c = 2
d = 2

等等

【问题讨论】:

标签: javascript arrays


【解决方案1】:

类似这样的:

uniqueCount = ["a","b","c","d","d","e","a","b","c","f","g","h","h","h","e","a"];
var count = {};
uniqueCount.forEach(function(i) { count[i] = (count[i]||0) + 1;});
console.log(count);

如果您不希望它在旧浏览器中中断,请使用简单的 for 循环而不是 forEach。

【讨论】:

  • @web_dev 他创建了一个名为 count 的关联数组对象,该对象将为数组中的每个唯一元素拥有一个键值对,其中键是唯一元素值,值是计数。他遍历数组并为每个值增加值或创建键值对(不存在的键的值计算为未定义,因此 || or 运算符取零并添加 1)
  • @neelmeg 也许为“forEach”编写所有参数有助于更好地理解(“i”是每个数组值,而不是索引):uniqueCount.forEach(function(value, index) { count[value] = (count[value] || 0) + 1; });
  • 多走一步并按总数排序的好方法是什么?
【解决方案2】:

const counts = {};
const sampleArray = ['a', 'a', 'b', 'c'];
sampleArray.forEach(function (x) { counts[x] = (counts[x] || 0) + 1; });
console.log(counts)

【讨论】:

  • 这绝对是最简单的答案
  • (counts[x] || 0)+1 这是怎么计算的?
  • @SidBhalke:表达式counts[x] || 0如果设置则返回counts[x]的值,否则返回0。然后只需添加一个并在对象中再次设置它,计数就完成了。
  • @SheetJS 如果您想知道为什么投反对票 - 是我;我在手机上浏览,并在没有注意到的情况下点击了按钮。一旦我发现恢复为时已晚。抱歉,答案真的很好。如果你想编辑它,我很乐意反转。
  • 还有reduce: var counts = your_array.reduce((map, val) => {map[val] = (map[val] || 0)+1; return map}, {} );
【解决方案3】:

您可以拥有一个包含计数的对象。遍历列表并增加每个元素的计数:

var counts = {};

uniqueCount.forEach(function(element) {
  counts[element] = (counts[element] || 0) + 1;
});

for (var element in counts) {
  console.log(element + ' = ' + counts[element]);
} 

【讨论】:

  • 你为什么要设置这个条件counts[element] || 0
  • 第一次访问counts[element] 返回undefined,因为该属性还没有值。如果您随后尝试添加undefined + 1,您将得到NaN(count[element] || 0) 将用0 替换undefined,因此添加1 会产生1 而不是NaN。 ECMAScript 2020 添加了 nullish 合并运算符 ??,它做了类似的事情,但更明确的是,当第一个值是 undefined(或 null)时,它使用第二个值。那个版本是(counts[element] ?? 0) + 1
【解决方案4】:

function count() {
    array_elements = ["a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];

    array_elements.sort();

    var current = null;
    var cnt = 0;
    for (var i = 0; i < array_elements.length; i++) {
        if (array_elements[i] != current) {
            if (cnt > 0) {
                document.write(current + ' comes --> ' + cnt + ' times<br>');
            }
            current = array_elements[i];
            cnt = 1;
        } else {
            cnt++;
        }
    }
    if (cnt > 0) {
        document.write(current + ' comes --> ' + cnt + ' times');
    }

}

count();

Demo Fiddle

你也可以使用高阶函数来进行操作。See this answer

【讨论】:

  • 循环后的额外 if 语句是不必要的...只需使用 for (var i = 0; i &lt;= array_elements.length; i++) {&lt;= 而不是 &lt;
  • 嗨@Vinay,也许你可以在这里帮助我? stackoverflow.com/questions/57819850/…
【解决方案5】:

你可以这样做:

uniqueCount = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
var map = new Object();

for(var i = 0; i < uniqueCount.length; i++) {
 if(map[uniqueCount[i]] != null) {
    map[uniqueCount[i]] += 1;
} else {
    map[uniqueCount[i]] = 1;
    }
}

现在您有了一张包含所有字符数的地图

【讨论】:

    【解决方案6】:

    好答案的组合:

    var count = {};
    var arr = ['a', 'b', 'c', 'd', 'd', 'e', 'a', 'b', 'c', 'f', 'g', 'h', 'h', 'h', 'e', 'a'];
    var iterator = function (element) {
        count[element] = (count[element] || 0) + 1;
    }
    
    if (arr.forEach) {
        arr.forEach(function (element) {
            iterator(element);
        });
    } else {
        for (var i = 0; i < arr.length; i++) {
            iterator(arr[i]);
        }
    }  
    

    希望对你有帮助。

    【讨论】:

      【解决方案7】:

      我认为这是计算数组中具有相同值的出现次数的最简单方法。

      var a = [true, false, false, false];
      a.filter(function(value){
          return value === false;
      }).length                                      
      

      【讨论】:

      • 问题是在不指定值的情况下询问如何执行此操作
      【解决方案8】:

      我偶然发现了这个(非常古老的)问题。有趣的是,缺少最明显和最优雅的解决方案(恕我直言):Array.prototype.reduce(...)。自 2011 年左右(IE)或更早(所有其他)以来,所有主要浏览器都支持此功能:

      var arr = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
      var map = arr.reduce(function(prev, cur) {
        prev[cur] = (prev[cur] || 0) + 1;
        return prev;
      }, {});
      
      // map is an associative array mapping the elements to their frequency:
      console.log(map);
      // prints {"a": 3, "b": 2, "c": 2, "d": 2, "e": 2, "f": 1, "g": 1, "h": 3}

      编辑:

      通过在箭头函数中使用comma operator,我们可以用一行代码编写它:

      var arr = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
      var map = arr.reduce((cnt, cur) => (cnt[cur] = cnt[cur] + 1 || 1, cnt), {});
      
      // map is an associative array mapping the elements to their frequency:
      console.log(map);
      // prints {"a": 3, "b": 2, "c": 2, "d": 2, "e": 2, "f": 1, "g": 1, "h": 3}

      但是,由于这可能更难阅读/理解,因此应该坚持使用第一个版本。

      【讨论】:

      • 在没有错误的参数重新分配的情况下,是否有其他方法可以做到这一点? prev[cur] = (prev[cur] || 0) + 1;
      • @keyboard-warrior 你说的“错误”是什么意思?这是完全合法的 JS 代码。它只是递增prev[cur],从0 开始。 (如果 prev[0] 未定义,则使用值 0 代替)。您也可以改用表达式(prev[cur] + 1) || 1,但这并没有太大区别。
      【解决方案9】:

      您可以在不使用任何 for/while 循环或 forEach 的情况下解决它。

      function myCounter(inputWords) {        
          return inputWords.reduce( (countWords, word) => {
              countWords[word] = ++countWords[word] || 1;
              return countWords;
          }, {});
      }
      

      希望对你有帮助!

      【讨论】:

        【解决方案10】:
        var uniqueCount = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
        // here we will collect only unique items from the array
        var uniqueChars = [];
        
        // iterate through each item of uniqueCount
        for (i of uniqueCount) {
        // if this is an item that was not earlier in uniqueCount, 
        // put it into the uniqueChars array
          if (uniqueChars.indexOf(i) == -1) {
            uniqueChars.push(i);
          } 
        }
        // after iterating through all uniqueCount take each item in uniqueChars
        // and compare it with each item in uniqueCount. If this uniqueChars item 
        // corresponds to an item in uniqueCount, increase letterAccumulator by one.
        for (x of uniqueChars) {
          let letterAccumulator = 0;
          for (i of uniqueCount) {
            if (i == x) {letterAccumulator++;}
          }
          console.log(`${x} = ${letterAccumulator}`);
        }
        

        【讨论】:

        • 感谢更新,对刚开始的人更有帮助。
        【解决方案11】:
        public class CalculateCount {
        public static void main(String[] args) {
            int a[] = {1,2,1,1,5,4,3,2,2,1,4,4,5,3,4,5,4};
            Arrays.sort(a);
            int count=1;
            int i;
            for(i=0;i<a.length-1;i++){
                if(a[i]!=a[i+1]){
                    System.out.println("The Number "+a[i]+" appears "+count+" times");
                    count=1;                
                }
                else{
                    count++;
                }
            }
            System.out.println("The Number "+a[i]+" appears "+count+" times");
        
        }   
        

        }

        【讨论】:

        • 你能围绕这个添加一些上下文吗?
        • 这是关于 JavaScript,而不是 Java。
        【解决方案12】:

        在包含字母的数组中重复:

        var arr = ["a", "b", "a", "z", "e", "a", "b", "f", "d", "f"],
          sortedArr = [],
          count = 1;
        
        sortedArr = arr.sort();
        
        for (var i = 0; i < sortedArr.length; i = i + count) {
          count = 1;
          for (var j = i + 1; j < sortedArr.length; j++) {
            if (sortedArr[i] === sortedArr[j])
              count++;
          }
          document.write(sortedArr[i] + " = " + count + "<br>");
        }

        包含数字的数组中的重复项:

        var arr = [2, 1, 3, 2, 8, 9, 1, 3, 1, 1, 1, 2, 24, 25, 67, 10, 54, 2, 1, 9, 8, 1],
          sortedArr = [],
          count = 1;
        sortedArr = arr.sort(function(a, b) {
          return a - b
        });
        for (var i = 0; i < sortedArr.length; i = i + count) {
          count = 1;
          for (var j = i + 1; j < sortedArr.length; j++) {
            if (sortedArr[i] === sortedArr[j])
              count++;
          }
          document.write(sortedArr[i] + " = " + count + "<br>");
        }

        【讨论】:

          【解决方案13】:

          通过使用 array.map 我们可以减少循环,请参阅jsfiddle

          function Check(){
              var arr = Array.prototype.slice.call(arguments);
              var result = [];
              for(i=0; i< arr.length; i++){
                  var duplicate = 0;
                  var val = arr[i];
                  arr.map(function(x){
                      if(val === x) duplicate++;
                  })
                  result.push(duplicate>= 2);
              }
              return result;
          }
          

          测试:

          var test = new Check(1,2,1,4,1);
          console.log(test);
          

          【讨论】:

            【解决方案14】:

            基于reduce数组函数的单行

            const uniqueCount =  ["a", "b", "c", "d", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];
            const distribution = uniqueCount.reduce((acum,cur) => Object.assign(acum,{[cur]: (acum[cur] || 0)+1}),{});
            console.log(JSON.stringify(distribution,null,2));

            【讨论】:

            【解决方案15】:

            var string = ['a','a','b','c','c','c','c','c','a','a','a'];
            
            function stringCompress(string){
            
            var obj = {},str = "";
            string.forEach(function(i) { 
              obj[i] = (obj[i]||0) + 1;
            });
            
            for(var key in obj){
              str += (key+obj[key]);
            }
              console.log(obj);
              console.log(str);
            }stringCompress(string)
            
            /*
            Always open to improvement ,please share 
            */

            【讨论】:

              【解决方案16】:

              创建一个文件,例如demo.js 并在控制台中使用节点demo.js 运行它,您将获得矩阵形式的元素。

              var multipleDuplicateArr = Array(10).fill(0).map(()=>{return Math.floor(Math.random() * Math.floor(9))});
              console.log(multipleDuplicateArr);
              
              var resultArr = Array(Array('KEYS','OCCURRENCE'));
              
              for (var i = 0; i < multipleDuplicateArr.length; i++) {
                var flag = true;
                for (var j = 0; j < resultArr.length; j++) {
                   if(resultArr[j][0] == multipleDuplicateArr[i]){
                     resultArr[j][1] = resultArr[j][1] + 1;
                     flag = false;
                    }
                }
                if(flag){
                  resultArr.push(Array(multipleDuplicateArr[i],1));
                }
              }
              
              console.log(resultArr);
              

              您将在控制台中得到如下结果:

              [ 1, 4, 5, 2, 6, 8, 7, 5, 0, 5 ] . // multipleDuplicateArr
              [ [ 'KEYS', 'OCCURENCE' ],        // resultArr
                [ 1, 1 ],
                [ 4, 1 ],
                [ 5, 3 ],
                [ 2, 1 ],
                [ 6, 1 ],
                [ 8, 1 ],
                [ 7, 1 ],
                [ 0, 1 ] ]
              

              【讨论】:

                【解决方案17】:

                // new example.
                var str= [20,1,-1,2,-2,3,3,5,5,1,2,4,20,4,-1,-2,5];
                
                function findOdd(para) {
                  var count = {};
                  para.forEach(function(para) {
                  count[para] = (count[para] || 0) + 1;
                  });
                  return count;
                }
                
                console.log(findOdd(str));

                【讨论】:

                  【解决方案18】:

                  最快的方法:

                  Сomputational complexity 是 O(n)。

                  function howMuchIsRepeated_es5(arr) {
                  	const count = {};
                  	for (let i = 0; i < arr.length; i++) {
                  		const val = arr[i];
                  		if (val in count) {
                  			count[val] = count[val] + 1;
                  		} else {
                  			count[val] = 1;
                  		}
                  	}
                  
                  	for (let key in count) {
                  		console.log("Value " + key + " is repeated " + count[key] + " times");
                  	}
                  }
                  
                  howMuchIsRepeated_es5(['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a']);

                  最短代码:

                  使用 ES6。

                  function howMuchIsRepeated_es6(arr) {
                  	// count is [ [valX, count], [valY, count], [valZ, count]... ];
                  	const count = [...new Set(arr)].map(val => [val, arr.join("").split(val).length - 1]);
                  
                  	for (let i = 0; i < count.length; i++) {
                  		console.log(`Value ${count[i][0]} is repeated ${count[i][1]} times`);
                  	}
                  }
                  
                  howMuchIsRepeated_es6(['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a']);

                  【讨论】:

                    【解决方案19】:
                    var arr = ['a','d','r','a','a','f','d'];  
                    
                    //call function and pass your array, function will return an object with array values as keys and their count as the key values.
                    duplicatesArr(arr);
                    
                    function duplicatesArr(arr){
                        var obj = {}
                        for(var i = 0; i < arr.length; i++){
                            obj[arr[i]] = [];
                            for(var x = 0; x < arr.length; x++){
                                (arr[i] == arr[x]) ? obj[arr[i]].push(x) : '';
                            }
                            obj[arr[i]] = obj[arr[i]].length;
                        }
                    
                        console.log(obj);
                        return obj;
                    }
                    

                    【讨论】:

                      【解决方案20】:

                      var testArray = ['a','b','c','d','d','e','a','b','c','f','g' ,'h','h','h','e','a'];

                      var newArr = [];
                      testArray.forEach((item) => {
                          newArr[item] = testArray.filter((el) => {
                                  return el === item;
                          }).length;
                      })
                      console.log(newArr);
                      

                      【讨论】:

                        【解决方案21】:

                        声明一个对象arr 来保存唯一集作为键。通过使用 map 循环遍历数组来填充 arr。如果之前没有找到该键,则添加该键并分配零值。在每次迭代中增加键的值。

                        给定 testArray:

                        var testArray = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
                        

                        解决方案:

                        var arr = {};
                        testArray.map(x=>{ if(typeof(arr[x])=="undefined") arr[x]=0; arr[x]++;});
                        

                        JSON.stringify(arr) 将输出

                        {"a":3,"b":2,"c":2,"d":2,"e":2,"f":1,"g":1,"h":3}
                        

                        Object.keys(arr) 将返回 ["a","b","c","d","e","f","g","h"]

                        查找任何项目的出现,例如b arr['b'] 将输出2

                        【讨论】:

                        • 请不要只发布代码作为答案,还要说明您的代码的作用以及它如何解决问题。带有解释的答案通常质量更高,更有可能吸引投票。
                        【解决方案22】:

                        在javascript中使用数组reduce方法很简单:

                        const arr = ['a','d','r','a','a','f','d'];
                        const result =  arr.reduce((json,val)=>({...json, [val]:(json[val] | 0) + 1}),{});
                        console.log(result)
                        //{ a:3,d:2,r:1,f:1 }

                        【讨论】:

                          【解决方案23】:

                          简单更好,一个变量,一个函数:)

                          const arr = ["a", "b", "c", "d", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];
                          
                          const counts = arr.reduce((acc, value) => ({
                             ...acc,
                             [value]: (acc[value] || 0) + 1
                          }), {});
                          
                          console.log(counts);

                          【讨论】:

                          • 我知道这是旧的,但它看起来很简单。任何人都可以向刚刚学习基本减少用法的新手解释这里发生了什么。
                          • 当然,reduce 允许您提供默认(第二个参数)值并将其通过 reduce 函数传回,这样您就可以继续检查新值,acc(累积)将随着我们不断更新'循环遍历每个数组值,将其分配给对象后,我们可以检查它是否存在,并在迭代时将其值更新为 1!希望这会有所帮助:)
                          【解决方案24】:
                          
                          // Initial array
                          let array = ['a', 'b', 'c', 'd', 'd', 'e', 'a', 'b', 'c', 'f', 'g', 'h', 'h', 'h', 'e', 'a'];
                          
                          // Unique array without duplicates ['a', 'b', ... , 'h']
                          let unique = [...new Set(array)];
                          
                          // This array counts duplicates [['a', 3], ['b', 2], ... , ['h', 3]] 
                          let duplicates = unique.map(value => [value, array.filter(str => str === value).length]);
                          

                          【讨论】:

                            【解决方案25】:

                            似乎没有人对此使用内置的Map(),这往往是我与Array.prototype.reduce()结合的首选:

                            const data = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
                            const result = data.reduce((a, c) => a.set(c, (a.get(c) || 0) + 1), new Map());
                            console.log(...result);

                            注意,如果您想在旧版浏览器中使用它,您必须polyfill Map()

                            【讨论】:

                            • 您能否深入解释一下这是如何工作的? (特别是 set / get 部分)。我试图将减速器分解为一个函数,但我有“get”不是响应的函数。
                            • 好的 getset 函数来自 Map 对象。但是初始的累加器不是 Map 对象,那为什么缩减版的 reducer 取一个呢?
                            • @AntoineNedelec 初始值一个新的Map对象;见 reduce 的第二个参数。 Map.prototype.set 返回映射对象,Map.prototype.get 返回 undefined 或提供给它的任何键的值。这让我们可以获取每个字母的当前计数(或0,如果未定义),然后将其加一,然后将该字母的计数设置为新计数,这将返回映射并成为新的累加器值。
                            【解决方案26】:
                            uniqueCount = ["a","b","a","c","b","a","d","b","c","f","g","h","h","h","e","a"];
                            var count = {};
                            uniqueCount.forEach((i) => { count[i] = ++count[i]|| 1});
                            console.log(count);
                            

                            【讨论】:

                              【解决方案27】:

                              简化的 sheet.js 回答

                              var counts = {};
                              var aarr=['a','b','a'];
                              aarr.forEach(x=>counts[x]=(counts[x] || 0)+1 );
                              console.log(counts)

                              【讨论】:

                                【解决方案28】:

                                代码:

                                function getUniqueDataCount(objArr, propName) {
                                    var data = [];
                                    if (Array.isArray(propName)) {
                                        propName.forEach(prop => {
                                            objArr.forEach(function(d, index) {
                                                if (d[prop]) {
                                                    data.push(d[prop]);
                                                }
                                            });
                                        });
                                    } else {
                                        objArr.forEach(function(d, index) {
                                            if (d[propName]) {
                                                data.push(d[propName]);
                                            }
                                        });
                                    }
                                
                                    var uniqueList = [...new Set(data)];
                                
                                    var dataSet = {};
                                    for (var i = 0; i < uniqueList.length; i++) {
                                        dataSet[uniqueList[i]] = data.filter(x => x == uniqueList[i]).length;
                                    }
                                
                                    return dataSet;
                                }
                                

                                片段

                                var data= [
                                          {day:'Friday'   , name: 'John'      },
                                          {day:'Friday'   , name: 'John'      },
                                          {day:'Friday'   , name: 'Marium'    },
                                          {day:'Wednesday', name: 'Stephanie' },
                                          {day:'Monday'   , name: 'Chris'     },
                                          {day:'Monday'   , name: 'Marium'    },
                                          ];
                                          
                                console.log(getUniqueDataCount(data, ['day','name']));       
                                   
                                function getUniqueDataCount(objArr, propName) {
                                    var data = [];
                                    if (Array.isArray(propName)) {
                                        propName.forEach(prop => {
                                            objArr.forEach(function(d, index) {
                                                if (d[prop]) {
                                                    data.push(d[prop]);
                                                }
                                            });
                                        });
                                    } else {
                                        objArr.forEach(function(d, index) {
                                            if (d[propName]) {
                                                data.push(d[propName]);
                                            }
                                        });
                                    }
                                
                                    var uniqueList = [...new Set(data)];
                                
                                    var dataSet = {};
                                    for (var i = 0; i < uniqueList.length; i++) {
                                        dataSet[uniqueList[i]] = data.filter(x => x == uniqueList[i]).length;
                                    }
                                
                                    return dataSet;
                                }

                                【讨论】:

                                • 我怎样才能为多个 propName 做到这一点,比如 Day 和 Name?
                                • @Aqeeliqbal 我已更新代码以现在接受一组道具。检查。
                                【解决方案29】:
                                let arr=[1,2,3,3,4,5,5,6,7,7]
                                let obj={}
                                for(var i=0;i<arr.length;i++){
                                    obj[arr[i]]=obj[arr[i]]!=null ?obj[arr[i]]+1:1 //stores duplicate in an obj
                                
                                }
                                console.log(obj)
                                //returns object {1:1,:1,3:2,.....}
                                

                                【讨论】:

                                • 请考虑在您的代码中添加注释以解释您的答案
                                【解决方案30】:

                                计算字符串中提供的字母

                                function countTheElements(){
                                    
                                    var str = "ssdefrcgfrdesxfdrgs";
                                    var arr = [];
                                    var count = 0;
                                    
                                    for(var i=0;i<str.length;i++){
                                        arr.push(str[i]);
                                        
                                    }
                                        arr.sort();
                                    for(var i=0;i<arr.length;i++){     
                                        if(arr[i] == arr[i-1]){
                                            count++;
                                        }else{        
                                            count = 1;        
                                        }
                                            if(arr[i] != arr[i+1]){
                                                console.log(arr[i] +": "+(count));
                                            }    
                                            
                                       }
                                    }
                                        countTheElements()
                                

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2021-08-29
                                  • 2011-07-12
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多