2

I have the following array:

var arr = [{
  "id": 1,
  "versionID": 1,
  "versionNR": 1,
  "format": "<div><label for=\"Part_1\">Part 1</label><input data-id=\"1\" id=\"Part_1\" type=\"checkbox\" /></div>"
}, {
  "id": 65,
  "versionID": 65,
  "versionNR": 1,
  "format": "<div><label for=\"Part_65\">Part 2</label><input data-id=\"65\" id=\"Part_65\" type=\"checkbox\" /></div>"
}, {
  "id": 92,
  "versionID": 1,
  "versionNR": 2,
  "format": "<div><label for=\"Part_92\">Part 1</label><input data-id=\"92\" id=\"Part_92\" type=\"checkbox\" /></div>"
}, {
  "id": 93,
  "versionID": 65,
  "versionNR": 2,
  "format": "<div><label for=\"Part_93\">Part 2</label><input data-id=\"93\" id=\"Part_93\" type=\"checkbox\" /></div>"
}, {
  "id": 96,
  "versionID": 65,
  "versionNR": 3,
  "format": "<div><label for=\"Part_96\">Part 2</label><input data-id=\"96\" id=\"Part_96\" type=\"checkbox\" /></div>"
}]

var dupes = {};
var singles = [];

$.each(arr, function(i, el) {

    if (!dupes[el.versionID]) {
        dupes[el.versionID] = true;
        singles.push(el);
    }
});

console.log(singles)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

What I'm trying to achive is to each unique versionID and return the object with the highest versionNR

My desired result would be:

var arr = [{
  "id": 92,
  "versionID": 1,
  "versionNR": 2,
  "format": "<div><label for=\"Part_92\">Part 1</label><input data-id=\"92\" id=\"Part_92\" type=\"checkbox\" /></div>"
},{
  "id": 96,
  "versionID": 65,
  "versionNR": 3,
  "format": "<div><label for=\"Part_96\">Part 2</label><input data-id=\"96\" id=\"Part_96\" type=\"checkbox\" /></div>"
}]
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

As you can see it the first code Example, it returns correct versionID = 1 & 65, but versionNR is 1 AND not the highest.

I'm suck on getting the result I want. Can someone help me out.

3 Answers 3

1

You can use array#reduce to group your array based on versionID. If the object already contains versionID then compare the versionNR and store the one with the highest value.

var arr = [{
  "id": 1,
  "versionID": 1,
  "versionNR": 1,
  "format": "<div><label for=\"Part_1\">Part 1</label><input data-id=\"1\" id=\"Part_1\" type=\"checkbox\" /></div>"
}, {
  "id": 65,
  "versionID": 65,
  "versionNR": 1,
  "format": "<div><label for=\"Part_65\">Part 2</label><input data-id=\"65\" id=\"Part_65\" type=\"checkbox\" /></div>"
}, {
  "id": 92,
  "versionID": 1,
  "versionNR": 2,
  "format": "<div><label for=\"Part_92\">Part 1</label><input data-id=\"92\" id=\"Part_92\" type=\"checkbox\" /></div>"
}, {
  "id": 93,
  "versionID": 65,
  "versionNR": 2,
  "format": "<div><label for=\"Part_93\">Part 2</label><input data-id=\"93\" id=\"Part_93\" type=\"checkbox\" /></div>"
}, {
  "id": 96,
  "versionID": 65,
  "versionNR": 3,
  "format": "<div><label for=\"Part_96\">Part 2</label><input data-id=\"96\" id=\"Part_96\" type=\"checkbox\" /></div>"
}];
var result = Object.values(arr.reduce((r,o) => {
  if(o.versionID in r) {
    if(o.versionNR > r[o.versionID].versionNR)
      r[o.versionID] = Object.assign({},o);
  } else {
    r[o.versionID] = Object.assign({}, o);
  }
  return r;
},{}));

console.log(result)

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks alot, just what i wanted
1

I added an answer without reduce, since some people, myself included, still aren't at ease with it.

var arr = [{
  "id": 1,
  "versionID": 1,
  "versionNR": 1,
  "format": "<div><label for=\"Part_1\">Part 1</label><input data-id=\"1\" id=\"Part_1\" type=\"checkbox\" /></div>"
}, {
  "id": 65,
  "versionID": 65,
  "versionNR": 1,
  "format": "<div><label for=\"Part_65\">Part 2</label><input data-id=\"65\" id=\"Part_65\" type=\"checkbox\" /></div>"
}, {
  "id": 92,
  "versionID": 1,
  "versionNR": 2,
  "format": "<div><label for=\"Part_92\">Part 1</label><input data-id=\"92\" id=\"Part_92\" type=\"checkbox\" /></div>"
}, {
  "id": 93,
  "versionID": 65,
  "versionNR": 2,
  "format": "<div><label for=\"Part_93\">Part 2</label><input data-id=\"93\" id=\"Part_93\" type=\"checkbox\" /></div>"
}, {
  "id": 96,
  "versionID": 65,
  "versionNR": 3,
  "format": "<div><label for=\"Part_96\">Part 2</label><input data-id=\"96\" id=\"Part_96\" type=\"checkbox\" /></div>"
}]

var res = {};

$.each(arr, function(i, el) {
    if (!res[el.versionID] || res[el.versionID].versionNR < el.versionNR) {
        res[el.versionID] = el;
    }
});

var ret = [];
$.each(res,function(k,v){
  ret.push(v);
});

console.log(ret);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Comments

0
var uni = [];
for (var i = 0; i < arr.length; i++) {
    var find = false;
    for (var k=0; k < uni.length; k++) {
        if (arr[i]['versionID'] == uni[k]['versionID']) {
            if (arr[i]['versionNR'] > uni[k]['versionNR']) {
                uni[k]['versionNR'] = arr[i]['versionNR'];
                uni[k]['format'] = arr[i]['format'];
            }
            find = true;
        }
    }
    if (find == false) {
        uni.push(arr[i]);
    }
}

In array uni is result

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.