[英]Finding distinct object in array by 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
}
]
我想按es6
按group
和age
查找不同的数据
预期结果
[
{
group: 'A',
age: 10
},
{
group: 'B',
age: 15
},
{
group: 'B',
age: 20
}
]
我尝试使用[... new Set(data.map(x => {x.group, g.age}))]
但没有机会
我知道如何遍历数据并找到唯一值,但我想使用es6
函数
您可以使用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)
像 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);
另一种更易读但更长的方法是:
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});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.