[英]Filter array to unique objects by object.property
我想要實現的是過濾objects
數組,以便獲得具有獨特演員的對象數組。
所以這就是我目前擁有的:
var objects = [{ actor: { account: null, degraded: false, mbox: null, mbox_sha1sum: "843c56da78f9eb888274d2d4e12ab1d748ec46234", name: "name", openid: null }, capture: 'value' }, { actor: { account: null, degraded: false, mbox: null, mbox_sha1sum: "843c56da78f9eb888274d2d4e12ab1d748ec12345", name: "name2", openid: null }, capture: 'value2' }, { actor: { account: null, degraded: false, mbox: null, mbox_sha1sum: "843c56da78f9eb888274d2d4e12ab1d748ec46234", name: "name", openid: null }, capture: 'value3' } ]; objects.filter((value, index, self) => { return self.indexOf(value) === index; }).map(ele => { console.log(ele.capture); });
期望的結果是一個不包含最后一個數組元素的數組,因為此 actor 屬性與第一個數組元素匹配。
但正如您所看到的,目前它沒有過濾任何數組元素。
起初我以為return self.indexOf(value.value) === index;
可以解決這個問題,但是這會返回一個空數組。
預期結果是:
[{
actor: {
account: null,
degraded: false,
mbox: null,
mbox_sha1sum: "843c56da78f9eb888274d2d4e12ab1d748ec46234",
name: "name",
openid: null
},
capture: 'value'
},
{
actor: {
account: null,
degraded: false,
mbox: null,
mbox_sha1sum: "843c56da78f9eb888274d2d4e12ab1d748ec12345",
name: "name2",
openid: null
},
capture: 'value2'
}
];
數組中的對象都是不同的對象,即使有些對象碰巧具有相同值的屬性。 .indexOf()
函數正在比較引用,而不是屬性值。
此外,在實踐中,三個對象都沒有相同的屬性,因為它們都有不同的.capture
值。
使用.findIndex()
而不是.indexOf()
,以便您可以比較屬性以找到匹配的對象:
objects.filter((value, index, self) => {
return self.findIndex(v => v.actor.name === value.actor.name) === index;
})
在這里,我只是使用了.actor.name
屬性,當然,如果需要,您可以比較其他屬性。
(請注意.findIndex()
是一個 ES6 函數,但我認為這很好,因為您的代碼已經在使用箭頭函數。或者您可以對其進行polyfill 。)
var objects = [{ actor: { account: null, degraded: false, mbox: null, mbox_sha1sum: "843c56da78f9eb888274d2d4e12ab1d748ec46234", name: "name", openid: null }, capture: 'value' }, { actor: { account: null, degraded: false, mbox: null, mbox_sha1sum: "843c56da78f9eb888274d2d4e12ab1d748ec12345", name: "name2", openid: null }, capture: 'value2' }, { actor: { account: null, degraded: false, mbox: null, mbox_sha1sum: "843c56da78f9eb888274d2d4e12ab1d748ec46234", name: "name", openid: null }, capture: 'value3' } ]; objects.filter((value, index, self) => { return self.findIndex(v => v.actor.name === value.actor.name) === index; }).map(ele => { console.log(ele.capture); });
如果您也可以使用Object Literal來過濾唯一元素。
var objects = [{ actor: { account: null, degraded: false, mbox: null, mbox_sha1sum: "843c56da78f9eb888274d2d4e12ab1d748ec46234", name: "name", openid: null }, capture: 'value' }, { actor: { account: null, degraded: false, mbox: null, mbox_sha1sum: "843c56da78f9eb888274d2d4e12ab1d748ec46234", name: "name", openid: null }, capture: 'value3' } ]; const uniqueObjMap = {}; for (const object of objects) { uniqueObjMap[object.actor.name] = object; } const uniqueObjects = Object.values(uniqueObjMap); console.log(uniqueObjects)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.