Finding a single object in an es6 array

I have an array as shown below

const data = [
    {
        name:'AAAA',
        group: 'A',
        age:10
    },
    {
        name:'ABCD',
        group: 'A',
        age:10
    },
    {
        name:'DJSHDJH',
        group: 'B',
        age:15
    },
    {
        name:'FJHF',
        group: 'B',
        age:20
    }
]

      

I want to find different data group

and age

ones6

Expected Result

[
    {
        group: 'A',
        age: 10
    },
    {
        group: 'B',
        age: 15
    },
    {
        group: 'B',
        age: 20
    }
]

      

I tried to use [... new Set(data.map(x => {x.group, g.age}))]

but not by accident

I know how to iterate over data and find unique values, but I want to use the functions es6

+3


source to share


2 answers


You can use Object.values()

c reduce()

to return an array of values ​​as a result.



const data = [{"name":"AAAA","group":"A","age":10},{"name":"ABCD","group":"A","age":10},{"name":"DJSHDJH","group":"B","age":15},{"name":"FJHF","group":"B","age":20}]

var result = Object.values(data.reduce((r, e) => (r[e.group + '|' + e.age] = {group: e.group, age: e.age}, r), {}))
console.log(result)
      

Run codeHide result


Another way to write the code suggested @Jeremy Thille

is to use template literals and shorthand property value



const data = [{"name":"AAAA","group":"A","age":10},{"name":"ABCD","group":"A","age":10},{"name":"DJSHDJH","group":"B","age":15},{"name":"FJHF","group":"B","age":20}]

var result = Object.values(data.reduce(function(r, e) {
  let group = e.group, age = e.age;
  return r[`${group}|${age}`] = {group, age}, r
}, {}))

console.log(result)
      

Run codeHide result


You can also use ES6 parameter destructuring as suggested @gyre

.



const data = [{"name":"AAAA","group":"A","age":10},{"name":"ABCD","group":"A","age":10},{"name":"DJSHDJH","group":"B","age":15},{"name":"FJHF","group":"B","age":20}]

var result = Object.values(data.reduce((r, {group, age}) => (r[group+'|'+age] = {group, age}, r), {}))
console.log(result)
      

Run codeHide result


+8


source


Using a lookup table in the same way as Nenad's code is the correct way to accomplish this task, however, just for variety, I'm including a sort and shorten solution, which is obviously less efficient.



var data   = [{"name":"AAAA","group":"A","age":10},
              {"name":"DJSHDJH","group":"B","age":15},
              {"name":"ABCD","group":"A","age":10},
              {"name":"FJHF","group":"B","age":20},
              {"name":"ABCD","group":"A","age":12},
              {"name":"SOLUS","group":"B","age":15},],
    result = data.sort((a,b) => a.group.localeCompare(b.group) || a.age - b.age)
                 .reduce((r,c,i) => i ? r[r.length-1].group == c.group && r[r.length-1].age == c.age ? r 
                                                                                                     : r.concat({group:c.group, age:c.age})
                                      : [{group:c.group, age:c.age}], []);
console.log(result);
      

Run codeHide result


+2


source







All Articles