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

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

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

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

Q&A

解決済

2回答

874閲覧

【Javascript】連想配列にないキーを検索して無い分の要素を追加したい

asahiko123

総合スコア43

JavaScript

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

0グッド

0クリップ

投稿2021/10/22 14:51

前提・実現したいこと

groupに含まれないlistAの値の組み合わせがあれば、time:0を加えて新たに要素をgroupに追加したいです。
groupには {name: 'A', type: 'typeD'}、 {name: 'B', type: 'typeC'}の組み合わせがないのでこれらを
listAを使って特定し、追加するというようなことがしたいです。

const group=[ { stuff: {name: 'A'} time: 60 style: {type: 'typeA'}}, { stuff: {name: 'A'} time: 120 style: {type: 'typeB'}}, { stuff: {name: 'A'} time: 83 style: {type: 'typeC'}}, { stuff: {name: 'B'} time: 257 style: {type: 'typeB'}}, { stuff: {name: 'B'} time: 120 style: {type: 'typeD'}}, { stuff: {name: 'B'} time: 66 style: {type: 'typeA'}} ]

検索キー

const listA=[ {name: 'A', type: 'typeA'}, {name: 'A', type: 'typeB'}, {name: 'A', type: 'typeC'}, {name: 'A', type: 'typeD'}, {name: 'B', type: 'typeA'}, {name: 'B', type: 'typeB'}, {name: 'B', type: 'typeC'}, {name: 'B', type: 'typeD'}, ]

最終的にgroupに追加したい要素

{ stuff: {name: 'A'} time: 0 style: {type: 'typeD'}}, { stuff: {name: 'B'} time: 0 style: {type: 'typeC'}},

試したこと

groupのtypeの値 と listAのtypeの値
groupのnameの値 と listAのnameの値

を比較しているのですが、groupのtype、nameの値に'typeD'、'typeC'が
ないことをどう示せばいいかわかりません。

type、nameの種類と数は動的に変わるので、文字列を直接指定して
の比較はしてません

listA.map(x=>group.filter(y=>y.style.type !== x.type)

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

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

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

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

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

guest

回答2

0

計算量を気にするなら name と type の組み合わせが group に存在するかどうかのチェックを O(1) でやるために SetObject を利用すべきです。が、group がそんなに大きくないなら、シンプルにループを回して存在チェックしても良いのではないでしょうか。

js

1for (let {name, type} of listA) { 2 if (group.findIndex( 3 item => name == item.stuff.name && type == item.style.type) 4 == -1) 5 group.push({stuff:{name}, time:0, style:{type}}); 6}

投稿2021/10/22 16:54

編集2021/10/22 16:59
int32_t

総合スコア21018

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

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

asahiko123

2021/10/24 07:28

回答ありがとうございます。 groupはそんなに多くないのでループを使いたいと思います。
guest

0

ベストアンサー

name と type をハイフンでつなげた、"A-typeB" のような形式の文字列を、配列groupおよび配列listAの要素のキー(key) と呼ぶことにして、
(1) group に含まれる全要素のキーの集合(Set)を作る。
(2) listAの要素のうち、groupに追加すべきオブジェクトの元になる要素をfilterで抽出する。その際に(1)のSetを使う。
(3) (2)で作った、listAをfilterして出来た配列の要素を加工して、groupの要素の形式にする。(mapを使う)
(4) (3)で出来た配列の要素を、group に追加する。(forEachを使う)

という流れをコードにすると、こんなんでいけるっしょ

javascript

1const setOfKeys = new Set(group.map(e => `${e.stuff.name}-${e.style.type}`)); 2 3listA 4 .filter(({ name, type }) => !setOfKeys.has(`${name}-${type}`)) 5 .map(({ name, type }) => ({ stuff: { name }, time: 0, style: { type } })) 6 .forEach(e => { 7 group.push(e); 8 });

???? Codepen で動かしてみる

または、Set を使わないでやるんだったら、

javascript

1listA 2 .filter(({ name, type }) => 3 group.every(e => name !== e.stuff.name || type !== e.style.type) 4 ) 5 .map(({ name, type }) => ({ stuff: { name }, time: 0, style: { type } })) 6 .forEach(e => { 7 group.push(e); 8 });

???? Codepen で動かしてみる

投稿2021/10/22 15:48

編集2021/10/22 16:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

asahiko123

2021/10/24 07:21

回答ありがとうございます。 過程まで示していただけて理解しやすかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問