对象的过滤器和唯一数组
Filter and uniq array of objects
我有一组对象。每个对象都有两个字段 "type" 和 "position"。我想知道是否有任何对象(在此数组中)具有相同的 "type" 和 "position"(并获取它)。我怎样才能意识到呢?我知道如何过滤数组,但如何与其他对象进行比较?
var array = forms.filter(function (obj) {
return obj.type === 100
});
您可以取一个 Map
,将相同的 type/postion 个对象分组,然后过滤分组的结果以获得长度大于 1 的结果。
var data = [{ type: 'a', position: 1 }, { type: 'b', position: 1 }, { type: 'a', position: 1 }, { type:'a', position: 2 }, { type: 'b', position: 2 }, { type: 'c', position: 1 }, { type:'c', position: 1 }],
duplicates = Array
.from(
data
.reduce((m, o) => {
var key = ['type', 'position'].map(k => o[k]).join('|');
return m.set(key, (m.get(key) || []).concat(o));
}, new Map)
.values()
)
.filter(({ length }) => length > 1);
console.log(duplicates);
这是另一种方法:
const data = [
{ type: 'a', position: 1 },
{ type: 'b', position: 1 },
{ type: 'a', position: 1 },
{ type: 'a', position: 2 },
{ type: 'b', position: 2 },
{ type: 'c', position: 1 },
{ type: 'c', position: 1 }
]
const duplicates = data =>
data.reduce((prev, el, index) => {
const key = JSON.stringify({ p: el.position, t: el.type })
prev[key] = prev[key] || []
prev[key].push(el)
if (index === data.length - 1) {
return Object.values(prev).filter(dups => dups.length > 1)
}
return prev
}, {})
console.log(duplicates(data))
我有一组对象。每个对象都有两个字段 "type" 和 "position"。我想知道是否有任何对象(在此数组中)具有相同的 "type" 和 "position"(并获取它)。我怎样才能意识到呢?我知道如何过滤数组,但如何与其他对象进行比较?
var array = forms.filter(function (obj) {
return obj.type === 100
});
您可以取一个 Map
,将相同的 type/postion 个对象分组,然后过滤分组的结果以获得长度大于 1 的结果。
var data = [{ type: 'a', position: 1 }, { type: 'b', position: 1 }, { type: 'a', position: 1 }, { type:'a', position: 2 }, { type: 'b', position: 2 }, { type: 'c', position: 1 }, { type:'c', position: 1 }],
duplicates = Array
.from(
data
.reduce((m, o) => {
var key = ['type', 'position'].map(k => o[k]).join('|');
return m.set(key, (m.get(key) || []).concat(o));
}, new Map)
.values()
)
.filter(({ length }) => length > 1);
console.log(duplicates);
这是另一种方法:
const data = [
{ type: 'a', position: 1 },
{ type: 'b', position: 1 },
{ type: 'a', position: 1 },
{ type: 'a', position: 2 },
{ type: 'b', position: 2 },
{ type: 'c', position: 1 },
{ type: 'c', position: 1 }
]
const duplicates = data =>
data.reduce((prev, el, index) => {
const key = JSON.stringify({ p: el.position, t: el.type })
prev[key] = prev[key] || []
prev[key].push(el)
if (index === data.length - 1) {
return Object.values(prev).filter(dups => dups.length > 1)
}
return prev
}, {})
console.log(duplicates(data))