簡體   English   中英

通過 object.property 將數組過濾為唯一對象

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM