1

I have an array of objects

var arr = [{ name: 'ABC', class: 'A', section:'1', roll_no: '123' },
           { name: 'xyz', class: 'A', section:'1', roll_no: '456' },
           { name: 'AKM', class: 'B', section:'2', roll_no: '333' },
           { name: 'PQR', class: 'A', section:'1', roll_no: '444' },
           { name: 'STU', class: 'B', section:'2', roll_no: '533' },
           { name: 'JKL', class: 'B', section:'2', roll_no: '987' }];

Here you can see I am having class and section, I want to find distinct class and section values.

For example, I want to get 2 classes A and B and 2 section 1 and 2.

How can I get the distinct values in a different array?

Thanks.

EDIT

The output I am expecting is :

var output = [{ class: 'A', section:'1'},
              { class: 'B', section:'2'}
             ];

This is not a duplicated question I am not using underscore js.

Arpit Kumar
  • 2,179
  • 5
  • 28
  • 53

4 Answers4

3

The solution using Set object and Array.prototype.forEach() function:

var arr = [{ name: 'ABC', class: 'A', section:'1', roll_no: '123' },
    { name: 'xyz', class: 'A', section:'1', roll_no: '456' },
    { name: 'AKM', class: 'B', section:'2', roll_no: '333' },
    { name: 'PQR', class: 'A', section:'1', roll_no: '444' },
    { name: 'STU', class: 'B', section:'2', roll_no: '533' },
    { name: 'JKL', class: 'B', section:'2', roll_no: '987' }];

var s = new Set(),
    result = [];

arr.forEach(function (o) {
    var hash = o.class + o.section;
    if (!s.has(hash)) {  // ensuring the unique combination of `class`+`section` values
        result.push({class: o.class, section: o.section});
        s.add(hash);
    }
});

console.log(result);
RomanPerekhrest
  • 88,541
  • 4
  • 65
  • 105
1
var arr = [{ name: 'ABC', class: 'A', section:'1', roll_no: '123' },
       { name: 'xyz', class: 'A', section:'1', roll_no: '456' },
       { name: 'AKM', class: 'B', section:'2', roll_no: '333' },
       { name: 'PQR', class: 'A', section:'1', roll_no: '444' },
       { name: 'STU', class: 'B', section:'2', roll_no: '533' },
       { name: 'JKL', class: 'B', section:'2', roll_no: '987' }];

Now the below arrA array will contain only elements with class 'A'.

var arrA = arr.filter((element) => element.class === 'A')

Read more about the Array.prototype.filter method here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

Greg
  • 1,851
  • 2
  • 19
  • 21
0

I did this with loops,

var arr = [{ name: 'ABC', class: 'A', section:'1', roll_no: '123' },
           { name: 'xyz', class: 'A', section:'1', roll_no: '456' },
           { name: 'AKM', class: 'B', section:'2', roll_no: '333' },
           { name: 'PQR', class: 'A', section:'1', roll_no: '444' },
           { name: 'STU', class: 'B', section:'2', roll_no: '533' },
           { name: 'JKL', class: 'B', section:'2', roll_no: '987' }];
var output = [], filters = [];
contains = false;
output.push(arr[0]);
filters.push({class: arr[0].class, section: arr[0].section});
for (var i = 1; i < arr.length; i++) {
    for (var j = 0; j < filters.length; j++) {
        if (filters[j].class !== arr[i].class && filters[j].section !== arr[i].section) {
            contains = false;
        } else {
            contains = true;
            break;
        }
    }
    if (!contains) {
        filters.push({class: arr[i].class,  section: arr[i].section});
        output.push(arr[i]);
    }
}
console.log(output);
NikhilGoud
  • 574
  • 1
  • 5
  • 21
0
var arr = [{ name: 'ABC', class: 'A', section:'1', roll_no: '123' },
           { name: 'xyz', class: 'A', section:'1', roll_no: '456' },
           { name: 'AKM', class: 'B', section:'2', roll_no: '333' },
           { name: 'PQR', class: 'A', section:'1', roll_no: '444' },
           { name: 'STU', class: 'B', section:'2', roll_no: '533' },
           { name: 'JKL', class: 'B', section:'2', roll_no: '987' }];

You can use reduce and some methods of Array.prototype. So, ES5 decision without loops:

var distinct = arr.reduce(function(curDistinct, curItem) {
  var bFlag =  curDistinct.some(function(curDistinctItem) {
    if (curDistinctItem.class == curItem.class && curDistinctItem.section == curItem.section)
      return true;
    else
      return false;
  });
  if (!bFlag) {
    curDistinct.push({class: curItem.class, section: curItem.section});
  }
  return curDistinct;
}, []);

For more information about used methods read this:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some