Javascript:计算数组对象中的出现次数

时间:2018-03-23 14:01:27

标签: javascript

如果我有这样的数组

    var array = [
    {name: "Source_one", alertName: "Alert_1"},
{name: "Source_three", alertName: "Alert_2"},
{name: "Source_one", alertName: "Alert_3"},
{name: "Source_two", alertName: "Alert_3"},
{name: "Source_one", alertName: "Alert_3"},
{name: "Source_one", alertName: "Alert_3"},
{name: "Source_two", alertName: "Alert_1"},
{name: "Source_one", alertName: "Alert_1"},
{name: "Source_two", alertName: "Alert_1"},
{name: "Source_two", alertName: "Alert_2"},
{name: "Source_one", alertName: "Alert_1"},
{name: "Source_two", alertName: "Alert_2"},
{name: "Source_three", alertName: "Alert_3"},
{name: "Source_two", alertName: "Alert_2"},
{name: "Source_two", alertName: "Alert_3"},
{name: "Source_three", alertName: "Alert_1"},
{name: "Source_three", alertName: "Alert_1"},
{name: "Source_one", alertName: "Alert_3"},
{name: "Source_three", alertName: "Alert_2"},
{name: "Source_three", alertName: "Alert_2"},
{name: "Source_two", alertName: "Alert_1"},
{name: "Source_three", alertName: "Alert_3"}
    ]

如果我想知道单个警报的每个点可能发生的次数怎么办?

我想创建这种输出:

 var output = [
    {name: "Source_one", alertName: "Alert_1", frequency:3},
{name: "Source_one", alertName: "Alert_3", frequency:4},
{name: "Source_two", alertName: "Alert_1", frequency:3},
{name: "Source_two", alertName: "Alert_2", frequency:3},
{name: "Source_two", alertName: "Alert_3", frequency:2},
{name: "Source_three", alertName: "Alert_1", frequency:2},
{name: "Source_three", alertName: "Alert_2", frequency:3},
{name: "Source_three", alertName: "Alert_3", frequency:2}
]

我真的不知道该怎么做。谢谢你的帮助

3 个答案:

答案 0 :(得分:1)

使用reduce

var array = [{name: "Source_one", alertName: "Alert_1"},{name: "Source_three", alertName: "Alert_2"},{name: "Source_one", alertName: "Alert_3"},{name: "Source_two", alertName: "Alert_3"},{name: "Source_one", alertName: "Alert_3"},{name: "Source_one", alertName: "Alert_3"},{name: "Source_two", alertName: "Alert_1"},{name: "Source_one", alertName: "Alert_1"},{name: "Source_two", alertName: "Alert_1"},{name: "Source_two", alertName: "Alert_2"},{name: "Source_one", alertName: "Alert_1"},{name: "Source_two", alertName: "Alert_2"},{name: "Source_three", alertName: "Alert_3"},{name: "Source_two", alertName: "Alert_2"},{name: "Source_two", alertName: "Alert_3"},{name: "Source_three", alertName: "Alert_1"},{name: "Source_three", alertName: "Alert_1"},{name: "Source_one", alertName: "Alert_3"},{name: "Source_three", alertName: "Alert_2"},{name: "Source_three", alertName: "Alert_2"},{name: "Source_two", alertName: "Alert_1"},{name: "Source_three", alertName: "Alert_3"}];

let resp = array.reduce((acc, ele) => {
    var prev = acc.find(x => x.name == ele.name && x.alertName == ele.alertName);
    if(prev) {
      prev.frequency++;
      return acc;
    }
    return acc.concat({name: ele.name, alertName: ele.alertName, frequency: 1})
  },[]);
      
console.log(resp);

答案 1 :(得分:0)

  • 您可以使用reduce
  • 功能
  • 创建一个用于分组对象的密钥。
  • Object.values以获得所需的输出。



var array = [    {name: "Source_one", alertName: "Alert_1"},{name: "Source_three", alertName: "Alert_2"},{name: "Source_one", alertName: "Alert_3"},{name: "Source_two", alertName: "Alert_3"},{name: "Source_one", alertName: "Alert_3"},{name: "Source_one", alertName: "Alert_3"},{name: "Source_two", alertName: "Alert_1"},{name: "Source_one", alertName: "Alert_1"},{name: "Source_two", alertName: "Alert_1"},{name: "Source_two", alertName: "Alert_2"},{name: "Source_one", alertName: "Alert_1"},{name: "Source_two", alertName: "Alert_2"},{name: "Source_three", alertName: "Alert_3"},{name: "Source_two", alertName: "Alert_2"},{name: "Source_two", alertName: "Alert_3"},{name: "Source_three", alertName: "Alert_1"},{name: "Source_three", alertName: "Alert_1"},{name: "Source_one", alertName: "Alert_3"},{name: "Source_three", alertName: "Alert_2"},{name: "Source_three", alertName: "Alert_2"},{name: "Source_two", alertName: "Alert_1"},{name: "Source_three", alertName: "Alert_3"}    ];
 
var result = Object.values(array.reduce((a, c) => {
  var key = ["name", "alertName"].map(k => c[k]).join('|');
  (a[key] || (a[key] = { name: c.name, alertName: c.alertName, frequency: 0})).frequency++;
  return a;
}, {}));

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 2 :(得分:0)

您可以使用namealertName的嵌套哈希表。

var array = [{ name: "Source_one", alertName: "Alert_1" }, { name: "Source_three", alertName: "Alert_2" }, { name: "Source_one", alertName: "Alert_3" }, { name: "Source_two", alertName: "Alert_3" }, { name: "Source_one", alertName: "Alert_3" }, { name: "Source_one", alertName: "Alert_3" }, { name: "Source_two", alertName: "Alert_1" }, { name: "Source_one", alertName: "Alert_1" }, { name: "Source_two", alertName: "Alert_1" }, { name: "Source_two", alertName: "Alert_2" }, { name: "Source_one", alertName: "Alert_1" }, { name: "Source_two", alertName: "Alert_2" }, { name: "Source_three", alertName: "Alert_3" }, { name: "Source_two", alertName: "Alert_2" }, { name: "Source_two", alertName: "Alert_3" }, { name: "Source_three", alertName: "Alert_1" }, { name: "Source_three", alertName: "Alert_1" }, { name: "Source_one", alertName: "Alert_3" }, { name: "Source_three", alertName: "Alert_2" }, { name: "Source_three", alertName: "Alert_2" }, { name: "Source_two", alertName: "Alert_1" }, { name: "Source_three", alertName: "Alert_3" }],
    hash = {},
    grouped = [];

array.forEach(({ name, alertName }) => {
    hash[name] = hash[name] || {};
    if (!hash[name][alertName]) {
        hash[name][alertName] = { name, alertName, frequency: 0 };
        grouped.push(hash[name][alertName]);
    }
    hash[name][alertName].frequency++;
});

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }