Javascript 计算对象中两个不同变量的元素组合出现次数的代码

Javascript code to count occurrences of combination of elements of two different variables within object

我有一个格式为

的数据
[
    {name: "a", class: "AA"},
    {name: "b", class: "BB"},
    {name: "xx", class: "XY"},
    {name: "a", class: "AA"},
    {name: "b", class: "BB"}
];

我正在尝试减少它以计算唯一名称和 class 值组合的出现次数,如下所示

name:"a", class:"AA", count: 2,
name:"b", class: "BB", count: 2,
name:"xx", class:"XY", count:1

如何在 Javascript 中实现这一点 减少一个变量的元素是我熟悉的事情,但两个不同变量的组合是我需要帮助的地方。对不起,如果这对你们中的一些人来说似乎很基本。

谢谢

一种方法是遍历数据数组并连接每个对象的名称和 class 属性,然后将其用作计数器对象的键,递增每个键的值。

var data = [{name:"a", class: "AA"}, {name:"b", class: "BB"}, {name:"xx", class: "XY"}, {name:"a", class:"AA"}, {name: "b", class:"BB"}];
var counter = {};
for (let obj of data) {
    let key = `${obj.name}${obj.class}`;
    if (counter[key] === undefined) {
        counter[key] = 0;
    }
    counter[key]++;
}
console.log(counter);

请记住,示例代码使用了来自 es6

的功能

您可以使用 forEach 循环和可选的 thisArg 参数执行此操作。

var data = [{name:"a", class: "AA"}, {name:"b", class: "BB"}, {name:"xx", class: "XY"}, {name:"a", class:"AA"}, {name: "b", class:"BB"}];

var result = [];
data.forEach(function(e) {
  if(!this[e.name+'|'+e.class]) {
    this[e.name+'|'+e.class] = {name: e.name, class: e.class, count: 0}
    result.push(this[e.name+'|'+e.class]);
  }
  this[e.name+'|'+e.class].count++;
});

console.log(result);

你可以这样做:

var input = [
    {name: "a", class: "AA"},
    {name: "b", class: "BB"},
    {name: "xx", class: "XY"},
    {name: "a", class: "AA"},
    {name: "b", class: "BB"}
];

var output = {};
input.forEach(function(element) {
  output[element.name] = output[element.name] || {};
  output[element.name][element.class] = output[element.name][element.class] || 0;
  ++output[element.name][element.class];
});

console.log(output);

如果您的对象都像您的示例中那样有序,您可以使用 JSON.stringify() 将它们转换为字符串。使用这些字符串作为对象的键,并使用该对象来计算每个键的出现次数。

优点:适用于每个对象,无论属性如何

缺点:您必须确保所有属性的顺序相同

这是一个 JsFiddle: https://jsfiddle.net/jgn2matg/

data = [] // your array here

data.reduce((result, value) => {
    const resultValue = result.find(resultItem => resultItem.name === value.name && resultItem.class === value.class); 

    resultValue ? resultValue.count++ : result.push(Object.assign(value, {count: 1}));

    return result;
}, []);