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
source to share
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)
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)
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)
source to share
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);
source to share