[解決済み】ES6でオブジェクトのプロパティをキーでフィルタリングする
2022-04-17 15:51:58
質問
例えば、あるオブジェクトがあるとします。
{
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を使ってこれを達成するクリーンな方法を探しているので、スプレッドオペレータが利用可能です。
どのように解決するのですか?
許容値のリストがあれば、それを使って簡単にオブジェクトに保持することができます。
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);
この例は突然変異に基づく解決策を示すものですが、これを使うことはお勧めしません。
関連
-
[解決済み】コンソールがUnterminated JSX contentsエラーを投げる【終了しました
-
[解決済み】Vueが定義されていない
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] JavaScriptのオブジェクトが空であることをテストするにはどうすればよいですか?
-
[解決済み] JavaScriptのオブジェクトにキーが存在するかどうかをチェックする?
-
[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
-
[解決済み] リスト内包とラムダ+フィルタの比較
-
[解決済み】未定義のオブジェクトプロパティを検出する
-
[解決済み】ES6クラス変数の代替品
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】React Js: Uncaught (in promise) SyntaxError: 位置 0 の JSON で予期しないトークン < が発生しました。
-
[解決済み】TypeError: 'undefined'はオブジェクトではありません。
-
[解決済み] jQueryで、ユーザーがそのフィールドを編集している間、テキストフィールドの最初の文字を大文字にするにはどうすればよいですか?
-
[解決済み】SecurityError: オリジンを持つフレームがクロスオリジンフレームにアクセスするのをブロックした
-
[解決済み】未定義のプロパティ 'bind' を読み込めない。React.js【重複あり
-
[解決済み】React.jsの配列の子要素のユニークキーを理解する
-
[解決済み】JavaScriptで相対URLへのリダイレクトを行う
-
[解決済み] .filterは機能ではありません[重複]。
-
[解決済み] JavaScriptのオブジェクトを1つのキーを除いてクローンするにはどうすればよいですか?
-
[解決済み】JavaScript:オブジェクトに対するfilter()