質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

519閲覧

JavaScriptでオブジェクト(連想配列の配列)から削除キーを指定したい

nikuatsu

総合スコア177

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/03/13 18:54

編集2022/03/13 19:19

実現したいこと

連想配列の配列employeesから、「削除キーを指定」して、firstnameageを削除したいと思っています。

JavaScript

1const employees = [ 2 { firstname: 'John', lastname: 'Smith', age: 20 }, 3 { firstname: 'John', lastname: 'Doe', age: 10 } 4];

つまり目的の値はこちらです。

JavaScript

1[ 2 { lastname: 'Smith' }, 3 { lastname: 'Doe' } 4]

試したコードA

以下のmapdeleteでは実現できませんでした。

JavaScript

1const result1 = employees.map(employee => { 2 delete employee.firstname; 3 delete employee.age 4}); 5console.log(result1);

試したコードB

以下のforEachだと実現できたのですが、「削除キーを指定」という方法ではなくなってしまいます。

JavaScript

1let result2 = []; 2employees.forEach((employee) => { 3 result2.push(employee.lastname) 4}); 5console.log(result2);

試したコードC

以下のようにincludesで探す方法もダメでした。

JavaScript

1const result3 = employees.map(employee => { 2 if( Object.keys(employee).includes('firstname') ){ 3 delete employee.firstname; 4 } 5 if( Object.keys(employee).includes('age') ){ 6 delete employee.age; 7 } 8}); 9console.log(result3 );

「削除キーを指定」という方法でresult2と同じ結果を得たいのですが、どのような書き方で実現できますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

非破壊な方法。

JavaScript

1const employees = [ 2 { firstname: 'John', lastname: 'Smith', age: 20 }, 3 { firstname: 'John', lastname: 'Doe', age: 10 } 4]; 5 6const dels = ['firstname','age']; 7 8const res = employees.map(employee => 9 Object.fromEntries(Object.entries(employee) 10 .filter(([key, value]) => !dels.includes(key)))) 11console.log(res)

投稿2022/03/14 02:49

編集2022/03/14 02:53
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikuatsu

2022/03/14 07:40

非破壊!求めていた処理でしたので助かりました。どうもありがとうございます。
guest

0

delete は undefined になるだけでなくなるわけじゃないです。
結局は不要なものをコピーしないというロジックにするしかないかなあ。

javascript

1const employees = [ 2 { firstname: 'John', lastname: 'Smith', age: 20 }, 3 { firstname: 'John', lastname: 'Doe', age: 10 } 4]; 5 6const dels = ['firstname','age']; 7 8res = []; 9for (x of employees) { 10 obj = {}; 11 for (y in x) { 12 if (dels.includes(y)) continue; 13 obj[y] = x[y]; 14 } 15 res.push(obj); 16} 17console.log(res)

--- 追記 ---
申し訳ない。勘違いでした。

javascript

1const employees = [ 2 { firstname: 'John', lastname: 'Smith', age: 20 }, 3 { firstname: 'John', lastname: 'Doe', age: 10 } 4]; 5 6const result1 = employees.map(employee => { 7 delete employee.firstname; 8 delete employee.age; 9 return employee; 10}); 11console.log(result1);

投稿2022/03/13 20:54

編集2022/03/13 21:07
takasima20

総合スコア7460

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikuatsu

2022/03/14 07:41

なるほど、最後に return employee; しないといけなかったのですね。ありがとうございます。
guest

0

削除なのですから破壊的に処理してはだめなのでしょうか?

javascript

1employees.forEach(employee => { 2 delete employee.firstname; 3 delete employee.age; 4});

投稿2022/03/14 00:15

yambejp

総合スコア114883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikuatsu

2022/03/14 07:42

なるほど、試したコードAと試したコードBをそう合わせればできましたね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問