繁体   English   中英

通过es6在数组中查找不同的对象

[英]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
    }
]

我想按es6groupage查找不同的数据

预期结果

[
    {
        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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM