我从服务器收到一系列复杂对象。我想过滤原始数组,以通过每个对象的子属性获得具有唯一对象的新数组,即:
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'的对象将被删除。感谢。
答案 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;
使用Array#filter
和Set
跟踪唯一值的替代方法
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;
答案 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;
}, []);