ES6でキーによってオブジェクトのプロパティをフィルタリングする 質問する

ES6でキーによってオブジェクトのプロパティをフィルタリングする 質問する

次のようなオブジェクトがあるとします。

{
  item1: { key: 'sdfd', value:'sdfd' },
  item2: { key: 'sdfd', value:'sdfd' },
  item3: { key: 'sdfd', value:'sdfd' }
}

上記のオブジェクトをフィルタリングして別のオブジェクトを作成したいので、次のようなものを作成します。

 {
    item1: { key: 'sdfd', value:'sdfd' },
    item3: { key: 'sdfd', value:'sdfd' }
 }

私は Es6 を使用してこれを実現するクリーンな方法を探しているので、スプレッド演算子が利用可能です。

ベストアンサー1

許可された値のリストがある場合は、次のようにしてオブジェクト内に簡単に保持できます。

const raw = {
  item1: { key: 'sdfd', value:'sdfd' },
  item2: { key: 'sdfd', value:'sdfd' },
  item3: { key: 'sdfd', value:'sdfd' }
};

const allowed = ['item1', 'item3'];

const filtered = Object.keys(raw)
  .filter(key => allowed.includes(key))
  .reduce((obj, key) => {
    obj[key] = raw[key];
    return obj;
  }, {});

console.log(filtered);

これは以下を使用します:

  1. Object.keysraw(元のデータ)のすべてのプロパティをリストするには、
  2. Array.prototype.filter許可リストにあるキーを選択するには、
    1. Array.prototype.includes彼らが出席していることを確認する
  3. Array.prototype.reduce許可されたプロパティのみを持つ新しいオブジェクトを構築します。

これにより、許可されたプロパティを含む浅いコピーが作成されます (ただし、プロパティ自体はコピーされません)。

使用することもできますオブジェクトスプレッド演算子一連のオブジェクトを変更せずに作成する(これについて言及してくれたrjerue):

const raw = {
  item1: { key: 'sdfd', value:'sdfd' },
  item2: { key: 'sdfd', value:'sdfd' },
  item3: { key: 'sdfd', value:'sdfd' }
};

const allowed = ['item1', 'item3'];

const filtered = Object.keys(raw)
  .filter(key => allowed.includes(key))
  .reduce((obj, key) => {
    return {
      ...obj,
      [key]: raw[key]
    };
  }, {});

console.log(filtered);

トリビアとして、元のデータから不要なフィールドを削除したい場合 (醜い変更がいくつか含まれるため、お勧めしませんincludes)、次のようにチェックを反転できます。

const raw = {
  item1: { key: 'sdfd', value:'sdfd' },
  item2: { key: 'sdfd', value:'sdfd' },
  item3: { key: 'sdfd', value:'sdfd' }
};

const allowed = ['item1', 'item3'];

Object.keys(raw)
  .filter(key => !allowed.includes(key))
  .forEach(key => delete raw[key]);

console.log(raw);

この例は、ミューテーション ベースのソリューションを示すために含まれていますが、これを使用することはお勧めしません。

おすすめ記事