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

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

436閲覧

JavaScriptでの配列の重複要素削除処理

T_Endo

総合スコア5

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2023/04/24 15:33

お世話になります。

JavaScriptでのオフジェクト配列の重複要素の削除に取り組んでいます。

Objectのkey項目は、
name subject score etc1 etc2 etc3であり、
これらのキー要素を持つObjectが配列型である想定です。

ここからname subject scoreが完全一致するものを排除し、新たな配列項目として取得したいと考えています。
ただしここで問題があり、重複を除き、新たなオブジェクト配列に加える際の条件として仮に上記の条件に一致するものがあったとしても、etc1 etc2 etc3のどれかに値が入ってる配列要素があれば(etc1~3のどれか1つでもnot nullのものがある)、そちらの配列要素を新たなオブジェクト配列にプッシュしたいです。

const inputObject = [
{
name: "氏名テスト",
subject: "国語",
score: "80",
etc1: null,
etc2: null,
etc3: null,
},
{
name: "氏名テスト",
subject: "国語",
score: "80",
etc1: null,
etc2: "1",
etc3: null,
}
]
である時、新たな配列にプッシュする要素としては、2つめの要素(インデックス番号は1)としたいです。

このロジックの実装法が分からず、ひとまず重複を排除するロジックのみ下記のように実装してみました。

JavaScript

1 var x; 2 var tmpObj = {}; 3 4 for(x = 0; x < inputObject.length; x++) { 5 tmpObj[inputObject[x]['name']+inputObject[x]['subject']+ 6 inputObject[x]['score']] = inputObject[x]; 7 } 8 9 var outputObject = []; 10 for(var key in tmpObj) { 11 outputObject.push(tmpObj[key]); 12 }

ここでetc1~3のうちいずれかでもnullでない項目があればそちらの配列要素をプッシュする・・・というのはどのような形で取り込めばいいでしょうか?
初歩的な質問で恐縮ですが、有識者の方、ご教示をよろしくお願いいたします。

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

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

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

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

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

otn

2023/04/24 15:49

name subject scoreが同一で、etc1~3のどれか1つでもnot nullのものが複数あった場合はどうするのですか?下記のどれをpush? ・より前の1つだけ ・より後ろの1つだけ ・全部
T_Endo

2023/04/24 16:08

大変申し訳ありません。前提の記載漏れでした。 etc1~3のどれか1つでもnot nullの配列要素は複数ありうるのですが、name subject scoreが同一でさえあれば、etc1~3の値設定パターンは必ず同一となります。(オールnullか、1~3のどれかに値が設定されており、そのパターンは1つだけ) 例えば、name subject scoreが同一でetc1 : null etc2 : "2" etc3 : nullという要素が二つ、三つあることはあっても、etc1 : "1" etc2 : null etc3 : null etc1 : null etc2 : "2" etc3 : nullのように異なる設定パターンで来ることはありません。 ご指摘ありがとうございます。
T_Endo

2023/04/24 16:13

そのため、etc1~3のどれか1つでもnot nullのものが複数あった場合はそのどれか一つの要素をオールnullより優先度高として、プッシュしてあげたい・・・という趣旨になります。
yambejp

2023/04/25 00:13

サンプルが少なくて何をどうしたいかわかりません。いくつかパターンをだし、ほしい結果を提示してください
yambejp

2023/04/25 00:54

疑問: etc1:1,etc2:null,etc3:nullとetc1:2,etc2:null,etc3:nullがあるとき 先・後どちらを残すのか?先だから?大きいから? 同様にetc1:1,etc2:null,etc3:nullとetc1:null,etc2:1,etc3:nullがあるとき 先・後どちらを残すのかもしくはetc1:1,etc2:1,etc3:nullとするのか?
guest

回答1

0

そのため、etc1~3のどれか1つでもnot nullのものが複数あった場合はそのどれか一つの要素をオールnullより優先度高として、プッシュしてあげたい・・・という趣旨になります。

と言うことであれば簡単で、「すでに同じキーの組でetcがall nullでないものが登録済みなら、プッシュしない」で、

・より前の1つだけ

になります。
重複チェックに、オブジェクトとプロパティーの代わりに、Mapとキーを使ってます。

JavaScript

1function make_key(x){ 2 return [x.name, x.subject, x.score].join("\t"); 3} 4function all_nulls(x){ 5 return x==undefined || ["etc1","etc2","etc3"].every(etc=>x[etc]==null); 6} 7 8const data = new Map(); 9 10inputObject.forEach( x => 11 all_nulls(data.get(make_key(x))) && data.set(make_key(x),x) ); 12const result = Array.from(data.values()); 13console.log(result);

または、

JavaScript

1function make_key(x){ 2 return [x.name, x.subject, x.score].join("\t"); 3} 4function not_all_nulls(x){ 5 return x && ["etc1","etc2","etc3"].some(a=>x[a]!=null); 6} 7 8const data = new Map(); 9 10inputObject.forEach( x => 11 not_all_nulls(data.get(make_key(x))) || data.set(make_key(x),x) ); 12const result = Array.from(data.values()); 13console.log(result);

どっちが分かり易いかよくわからなくなってきたので、両方書いておきます。

投稿2023/04/25 02:24

編集2023/04/25 14:42
otn

総合スコア84533

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問