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

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

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

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

Q&A

解決済

5回答

1512閲覧

[JavaScript] 一部の配列を削除したい

inukujira

総合スコア130

JavaScript

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

0グッド

1クリップ

投稿2020/02/18 23:37

すみません。
mapやらfilterやら使って試行錯誤してたんですが、どうしてもわからないので教えてください。

2つのリストがあります。
リストAのexistが1の場合(3.jpg)に、そのファイル名を元にリストAから"3.jpg"を削除するにはどのようにすればよいでしょうか?

javascript

1// リストA 2const listA= [ 3 { filename: "3.jpg", exist: 1 }, 4 { filename: "5.jpg", exist: 0 }, 5 { filename: "6.jpg", exist: 0 } 6]; 7 8// リストB 9const listB = { 10 Items: [ 11 { filename: "1.jpg", size: 1024 }, 12 { filename: "2.jpg", size: 1024 }, 13 { filename: "3.jpg", size: 1024 }, 14 { filename: "4.jpg", size: 1024 } 15 ] 16}; 17

求める形

javascript

1 Items: [ 2 { filename: "1.jpg", size: 1024 }, 3 { filename: "2.jpg", size: 1024 }, 4 { filename: "4.jpg", size: 1024 } 5 ] 6}; 7

どうかよろしくお願いします。

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

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

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

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

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

guest

回答5

0

ベストアンサー

こんにちは

以下は、 exist が1の filename の値(ファイル名)を要素とする Set を作っておいて、フィルターするときに使う案です。

javascript

1// 既存ファイル名のSetを作成 2const existingFiles = new Set(listA.filter(e => e.exist).map(e => e.filename)); 3 4// 既存ファイルSetの内容を確認 5console.log([...existingFiles]) 6 7// listB.Itemsの要素で既存ファイルSetにあるものを除外 8listB.Items = listB.Items.filter(item => !existingFiles.has(item.filename)); 9 10// 結果の確認 11console.log(listB.Items)

以下は、上記の動作確認用のサンプルです。

上記のサンプルでは、確認のため、listA に追加で exist が 1 の要素{ filename: "7.jpg", exist: 1 }を加え、listB.Items7.jpg の要素を2個追加しています。これらも除外されることを確認できます。

追記

exist が1の filename の値を集めたSet(または他の回答者様から提示されているように、配列)を作ってから、これを使って filter するのが効率的だと思いますが、これらの中間生成物を作らないでやろうとすると、以下で出来ます。

javascript

1listB.Items = listB.Items.filter(e1 => !listA.find(e2 => e1.filename === e2.filename));

ただしこれは、filter のループの中で、毎回 find するので非効率です。

投稿2020/02/19 00:43

編集2020/02/19 01:01
jun68ykt

総合スコア9058

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

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

inukujira

2020/02/19 01:34

ありがとうございました! とても助かりました!感謝です!
jun68ykt

2020/02/19 03:43

どういたしまして。参考になれば幸いです。
guest

0

javascript

1const excluder = (obj) => obj.exist === 1; 2const excludes = listA.filter(excluder).map(e=>e.filename); 3const listC = {Items:listB.Items.filter(e=> !excludes.includes(e.filename))}; 4console.log(listC);

投稿2020/02/19 00:08

papinianus

総合スコア12705

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

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

inukujira

2020/02/19 01:35

ありがとうございました! とても助かりました!感謝です!
guest

0

「リストAのexistが1の場合(3.jpg)に、そのファイル名を元にリストBから"3.jpg"を削除する」といことであれば、以下のように書くとできると思います。

js

1// リストA 2const listA = [ 3 { filename: "3.jpg", exist: 1 }, 4 { filename: "5.jpg", exist: 0 }, 5 { filename: "6.jpg", exist: 0 } 6]; 7 8// リストB 9const listB = { 10 Items: [ 11 { filename: "1.jpg", size: 1024 }, 12 { filename: "2.jpg", size: 1024 }, 13 { filename: "3.jpg", size: 1024 }, 14 { filename: "4.jpg", size: 1024 } 15 ] 16}; 17 18const existItem = listA.filter(item => item.exist === 1)[0]; 19const result = listB.Items.filter(item => item.filename !== existItem.filename); 20console.log(result); 21 22=> 23[ 24 { filename: "1.jpg", size: 1024 }, 25 { filename: "2.jpg", size: 1024 }, 26 { filename: "4.jpg", size: 1024 } 27]

もし、最初のリストにexist: 1のオブジェクトが複数ある場合は、以下のように書くとフィルタリングできると思います。

js

1// リストC 2const listC = [ 3 { filename: "1.jpg", exist: 1 }, 4 { filename: "3.jpg", exist: 1 }, 5 { filename: "6.jpg", exist: 0 } 6]; 7 8// リストD 9const listD = { 10 Items: [ 11 { filename: "1.jpg", size: 1024 }, 12 { filename: "2.jpg", size: 1024 }, 13 { filename: "3.jpg", size: 1024 }, 14 { filename: "4.jpg", size: 1024 } 15 ] 16}; 17 18const existFilenames = listC 19 .filter(item => item.exist === 1) 20 .map(item => item.filename); 21const result2 = listD.Items.filter( 22 item => existFilenames.indexOf(item.filename) === -1 23); 24console.log(result2); 25 26=> 27[ 28 { filename: "2.jpg", size: 1024 }, 29 { filename: "4.jpg", size: 1024 } 30]

サンプルコード

投稿2020/02/19 00:05

shgtkshruch

総合スコア665

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

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

inukujira

2020/02/19 01:35

ありがとうございました! とても助かりました!感謝です!
guest

0

JavaScript

1const existFilenames = listA.reduce((acc, {filename, exist}) => exist ? [...acc, filename] : acc, []); 2const listC = { 3 Items: listB.Items.filter(({filename}) => !existFilenames.includes(filename)) 4}; 5console.log(listC);

投稿2020/02/19 01:00

shinji709

総合スコア805

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

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

inukujira

2020/02/19 01:35

ありがとうございました! とても助かりました!感謝です!
guest

0

javascript

1const delImgs=listA.map(x=>x.exist==1?x.filename:undefined).filter(Boolean); 2listB.Items=listB.Items.filter(x=>!delImgs.includes(x.filename)); 3console.log(listB);

投稿2020/02/19 00:38

yambejp

総合スコア114839

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

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

inukujira

2020/02/19 01:34

ありがとうございました! とても助かりました!感謝です!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問