次のようなオブジェクトがあるとします。
{
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);
これは以下を使用します:
Object.keys
raw
(元のデータ)のすべてのプロパティをリストするには、Array.prototype.filter
許可リストにあるキーを選択するには、Array.prototype.includes
彼らが出席していることを確認する
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);
この例は、ミューテーション ベースのソリューションを示すために含まれていますが、これを使用することはお勧めしません。