通过比较子属性(typescript)从数组中删除“重复”对象

时间:2018-06-03 11:56:20

标签: javascript typescript

我从服务器收到一系列复杂对象。我想过滤原始数组,以通过每个对象的子属性获得具有唯一对象的新数组,即:

let arr1 = originalArray;
let arr2 = originalArray.filter((ele, idx, arr) => ....

现在,例如,arr1由3个对象组成:

firstObj = {
    id: 0,
    Details:
        {
            License: 123456
        },
    name: 'abc'
};
secondObj = {
    id: 1,
    Details:
        {
            License: 131313
        },
    name: 'xcd'
};
thirdObj = {
    id: 2,
    Details:
        {
            License: 123456
        },
    name: 'bcd'
};

所以,我想过滤数组,以便新返回的数组只包含两个对象,其中'License'属性是唯一的,也就是说,其中一个具有相同'License'的对象将被删除。感谢。

2 个答案:

答案 0 :(得分:3)

如果订单发生并不重要,可以使用Licence值作为键将其传递到Map

地图键必须是唯一的,这样在创建Map时会覆盖重复项,并返回每个副本的最后一个实例



let uniques = [...new Map(data.map(o=>[o.Details.License,o])).values()];


console.log(uniques)

<script>
let data = [{
  id: 0,
  Details: {
    License: 123456
  },
  name: 'abc'
}, {
  id: 1,
  Details: {
    License: 131313
  },
  name: 'xcd'
}, {
  id: 2,
  Details: {
    License: 123456
  },
  name: 'bcd'
}]
</script>
&#13;
&#13;
&#13;

使用Array#filterSet跟踪唯一值的替代方法

&#13;
&#13;
let licSet = new Set();
let uniques = data.filter(({Details: o}) => !licSet.has(o.License) && licSet.add(o.License));


console.log(uniques)
&#13;
<script>
  let data = [{
    id: 0,
    Details: {
      License: 123456
    },
    name: 'abc'
  }, {
    id: 1,
    Details: {
      License: 131313
    },
    name: 'xcd'
  }, {
    id: 2,
    Details: {
      License: 123456
    },
    name: 'bcd'
  }]
</script>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

如果不包含相同的array.reduce

,您可以使用Details.License循环遍历源数组并将项添加到结果中
let result = [firstObj, secondObj, thirdObj].reduce((arr, item) => {
    let exists = !!arr.find(x => x.Details.License === item.Details.License);
    if(!exists){
        arr.push(item);
    }
    return arr;
}, []);