-10

If I have an array like this

    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"}
    ]

how can I do if I want to know how may times each point happens for a single alert?

I would like to create this kind of output:

 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}
]

I really have no clue how to do that. Thanks for your help

SamK
  • 11
  • 3
  • where do you get the value of `frequency` in the output ? – Abslen Char Mar 23 '18 at 14:03
  • @AbdeslemCharif It's a count of how many times that alert is in the result set in the first part of post. – Ryan Wilson Mar 23 '18 at 14:04
  • If frequency is gonna be a count of all the times that alert appears, maybe it makes more sense to not include it as a property on each instance of that object? It might be a little cleaner to just filter the results by the record you want and then count them with .length. – Matt Waldron Mar 23 '18 at 14:12

3 Answers3

1

Use 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);
guijob
  • 4,413
  • 3
  • 20
  • 39
0
  • You can use the function reduce.
  • Create a key to group objects.
  • Object.values to get the desired output.

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; }
Ele
  • 33,468
  • 7
  • 37
  • 75
0

You could use a nested hash table for name and alertName.

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; }
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392