如何在javascript中计算数组中的重复值

det*_*o29 77 javascript arrays

目前,我有一个这样的数组:

var uniqueCount = Array();
Run Code Online (Sandbox Code Playgroud)

几步之后,我的数组看起来像这样:

uniqueCount = [a,b,c,d,d,e,a,b,c,f,g,h,h,h,e,a];
Run Code Online (Sandbox Code Playgroud)

我如何计算阵列中有多少a,b,c?我希望得到如下结果:

a = 3
b = 1
c = 2
d = 2
Run Code Online (Sandbox Code Playgroud)

等等

She*_*tJS 263

var counts = {};
your_array.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });
Run Code Online (Sandbox Code Playgroud)

  • 还有`reduce`:`var counts = your_array.reduce((map, val) => {map[val] = (map[val] || 0)+1; return map}, {} );` (7认同)
  • 这绝对是最简单的答案 (6认同)
  • @SidBhalke:表达式`counts [x] || 如果设置,则0`返回`counts [x]`的值,否则返回'0`.然后只需添加一个并在对象中再次设置它并完成计数. (4认同)
  • @SheetJS 如果你想知道为什么投反对票 - 是我;我正在移动设备上浏览,并点击了按钮,但实际上并没有注意到。当我发现要挽回时已经太晚了。对此表示歉意,答案非常好。如果你想编辑它,我很乐意逆转。 (3认同)
  • (counts [x] || 0)+1这怎么给count? (2认同)

lox*_*xxy 58

像这样的东西:

    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);
Run Code Online (Sandbox Code Playgroud)

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

  • @web_dev他创建了一个名为count的关联数组对象,它将为数组中的每个唯一元素提供一个键值对,其中键是唯一元素值,值是count.他遍历数组,并为每个值递增值或创建键值对(不存在键的值计算为未定义,因此||或运算符取零而添加1) (3认同)

isn*_*bad 29

我偶然发现了这个(非常古老的)问题.有趣的是,最明显和最优雅的解决方案(imho)缺失: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:
document.write(JSON.stringify(map));
// prints {"a": 3, "b": 2, "c": 2, "d": 2, "e": 2, "f": 1, "g": 1, "h": 3}
Run Code Online (Sandbox Code Playgroud)


Vin*_*ngh 18

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');
    }

}
Run Code Online (Sandbox Code Playgroud)

演示小提琴


Sha*_*ins 16

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

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);
Run Code Online (Sandbox Code Playgroud)


din*_*igo 9

单线基于减少阵列功能

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));
Run Code Online (Sandbox Code Playgroud)


aen*_*rew 8

似乎没有人对此使用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);
Run Code Online (Sandbox Code Playgroud)

注意,如果想在旧浏览器中使用它,则必须使用polyfillMap()


Eri*_*dán 7


// 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]);
Run Code Online (Sandbox Code Playgroud)


小智 5

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

var a = [true, false, false, false];
a.filter(function(value){
    return value === false;
}).length                                      
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

希望对您有帮助!


小智 5

在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 }
Run Code Online (Sandbox Code Playgroud)


小智 5

const obj = {};
const uniqueCount = [ 'a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'f', 'g', 'h', 'h', 'h', 'e', 'a' ];
for (let i of uniqueCount) obj[i] ? obj[i]++ : (obj[i] = 1);
console.log(obj);
Run Code Online (Sandbox Code Playgroud)