silver_fantom
silver_fantom

Reputation: 79

Finding missing groups members in arrays

I've got four lists - two for users and two for groups. I must check that in first users list they are users, which are not in second list.

My code:

importPackage(java.io);
importPackage(java.lang);

var list1 = "Han SOLO, Luke SKYWALKER, Darth VADER, Boba FETT".split(', ')
,list2 = "Luke SKYWALKER, Han SOLO, Lando CALRISSIAN, Boba FETT".split(', ')
// group lists
,group1 = "Group1, Group1, Group1, Group2".split(', ')
,group2 = "Group1, Group1, Group2, Group2".split(', ')
,j = 0
,msg = "";

   for(var j = 0; j < list2.length; j++) {

      if (list1.indexOf(list2[j]) == -1)
         msg = msg + list1[j] + " has been added to " + group1[j] + "<br />";

   }

print(msg); 

The results of this code is:

Darth VADER has been added to Group1

This result is good for me, but when I make that change:

var list1 = "Han SOLO, Luke SKYWALKER, Darth VADER, Boba FETT".split(', ')
,list2 = "Luke SKYWALKER, Han SOLO, Darth VADER, Boba FETT".split(', ')
// group lists
,group1 = "Group1, Group1, Group1, Group2".split(', ')
,group2 = "Group1, Group1, Group2, Group2".split(', ')

result is empty, but it should be:

Darth VADER has been added to Group1

I wonder what I should change, to correct this second script (where both users list are same).

Upvotes: 0

Views: 49

Answers (1)

Grundy
Grundy

Reputation: 13381

you can do some prepare before checking:

1) group by users like

function group(users, groups) {
  var result = {};
  for (var i = 0; i < users.length; i++) {
    var user = users[i];
    if (!result[user]) result[user] = {};
    result[users[i]][groups[i]] = true;
  }
  return result;
}

2) check groups defferent like

function comp(one, two) {
  function getGroups(u) {
    var groups = [];
    for (var i in u) groups.push(i);

    return groups;
  }

  var res = {};
  for (var i in one) {
    if (!two[i]) {
      res[i] = getGroups(one[i]);
    } else {
      var g = [],
        g1 = one[i],
        g2 = two[i];
      for (var j in g1) {
        if (!g2[j]) g.push(j);
      }
      res[i] = g;
    }
  }
  return res;
}

as result we have object like

{
    "Han SOLO": [],
    "Luke SKYWALKER": [],
    "Darth VADER": [
        "Group1"
    ],
    "Boba FETT": []
}

so with simple loop we can get all info about defferent like

var msg = '';

for (var i in res) {
  if (res[i].length) {
    msg += 'user ' + i + ' added in group: ' + res[i].join() + '<br>';
  }
}

var list1 = "Han SOLO, Luke SKYWALKER, Darth VADER, Boba FETT".split(', '),
  list2 = "Luke SKYWALKER, Han SOLO, Darth VADER, Boba FETT".split(', ')
  // group lists
  ,
  group1 = "Group1, Group1, Group1, Group2".split(', '),
  group2 = "Group1, Group1, Group2, Group2".split(', ');

function group(users, groups) {
  var result = {};
  for (var i = 0; i < users.length; i++) {
    var user = users[i];
    if (!result[user]) result[user] = {};
    result[users[i]][groups[i]] = true;
  }
  return result;
}

function comp(one, two) {
  function getGroups(u) {
    var groups = [];
    for (var i in u) groups.push(i);

    return groups;
  }

  var res = {};
  for (var i in one) {
    if (!two[i]) {
      res[i] = getGroups(one[i]);
    } else {
      var g = [],
        g1 = one[i],
        g2 = two[i];
      for (var j in g1) {
        if (!g2[j]) g.push(j);
      }
      res[i] = g;
    }
  }
  return res;
}

var res = comp(group(list1, group1), group(list2, group2));

var msg = '';

for (var i in res) {
  if (res[i].length) {
    msg += 'user ' + i + ' added in group: ' + res[i].join() + '<br>';
  }
}

document.getElementById('res').innerHTML = msg;
<p id="res"></p>

Upvotes: 2

Related Questions