object.property で配列を一意のオブジェクトにフィルターする 質問する

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);
});

このアクター プロパティは最初の配列要素と一致するため、望ましい結果は最後の配列要素で構成されない配列です。

しかし、ご覧のとおり、現時点では配列要素はいずれもフィルタリングされていません。

最初は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'
  }
];

ベストアンサー1

配列内のオブジェクトは、たとえ同じ値のプロパティを持つものがあったとしても、すべて異なるオブジェクトです。この.indexOf()関数は、プロパティ値ではなく参照を比較します。

また、実際には、3 つのオブジェクトはすべて異なる.capture値を持つため、どのオブジェクトも同一のプロパティを持つことはありません。

使用.findIndex()の代わりに を使用すると.indexOf()、プロパティを比較して一致するオブジェクトを見つけることができます。

objects.filter((value, index, self) => {
  return self.findIndex(v => v.actor.name === value.actor.name) === index;
})

ここではプロパティのみを使用しています.actor.nameが、もちろん必要に応じて追加のプロパティを比較することもできます。

(これは.findIndex()ES6関数ですが、コードで既に矢印関数を使用しているので問題ないと思います。または、ポリフィルする

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);
});

おすすめ記事