我有一个如下所示的数组
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
}
]
我希望group
和age
es6
找到不同的数据
预期结果
[
{
group: 'A',
age: 10
},
{
group: 'B',
age: 15
},
{
group: 'B',
age: 20
}
]
我尝试使用[... new Set(data.map(x => {x.group, g.age}))]
,但没有机会
我知道如何遍历数据并查找唯一值,但我想使用es6
函数
答案 0 :(得分:9)
您可以将Object.values()
与reduce()
一起使用,以返回值数组。
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)
编写@Jeremy Thille
建议的相同代码的另一种方法是使用模板文字和属性值缩写
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)
您也可以使用@gyre
建议的ES6参数解构。
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)
答案 1 :(得分:2)
使用像Nenad的代码一样的查找表是完成这项工作的正确方法,但是对于各种各样的我来说,通过排序和减少包含一个明显效率较低的解决方案。
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);

答案 2 :(得分:1)
另一种这样做的方法,可读性更高但更长的方法是:
var filteredData = [];
data.forEach((item)=>{
if(!filteredData.some(x=>x.group === item.group && x.age === item.age)){
filteredData.push(item);
}
});
// then you can change your result array if you want by using map
var result = filteredData.map(x=>{name:x.name,age:x.age});