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

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

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

配列

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

Q&A

解決済

2回答

843閲覧

JavaScriptで2つの配列を比較し、同じ構造の配列を見つけて取得する方法

yusuke1

総合スコア19

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

配列

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

0グッド

0クリップ

投稿2023/01/10 06:20

編集2023/01/10 06:21

前提

JavaScriptで2つの配列を比較し、同じ構造の配列を見つけて取得する方法が知りたいです

以下に例を挙げます。

2つ配列があります。

配列1

[ { name : "色", value : "赤" }, { name : "個数", value : "30個" } ]

配列2

[ { id: 1 selectedOptions : [ { name : "色", value : "赤" }, { name : "個数", value : "10個" }, ] }, { id: 2 selectedOptions : [ { name : "色", value : "赤" }, { name : "個数", value : "20個" }, ] }, { id: 3 selectedOptions : [ { name : "色", value : "赤" }, { name : "個数", value : "30個" }, ] }, { id: 4 selectedOptions : [ { name : "色", value : "黒" }, { name : "個数", value : "10個" }, ] }, ..... ]

実現したいこと

配列1の構造と同じ構造をもつものを、配列2のselectedOptionsから探し出し、合致する配列2のidを取得したいです。
上の例だと、色が赤で個数が30個なので、id:3が取得できればいいです。

試したこと

JSON.stringifyを利用して配列を文字列化して比較する方法をやりましたが、順番変わった場合に必ず合致したい可能性があると思い他の方法を探しています。

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

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

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

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

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

otn

2023/01/10 08:06

全部同じ構造ですね。構造じゃなくて「色の値が等しい」という中身の話に見えますが、そういうことですか?
guest

回答2

0

順番変わった場合に必ず合致したい可能性がある

など、今後の仕様変更に対応することを考慮すると以下の2つの判定を行う関数を作っておくのがよいかと思います。

  1. ある配列がオプションとして妥当な型(Shape)を持っている。
  2. 二つの配列がともにオプションであり、かつ内容が等しい。

以下はこれらの関数のサンプルですが、ご自身の要件に合わせて適宜修正(条件を緩めたり、追加したり)してください。

1. ある配列がオプションとして妥当な型(Shape)を持っている。

与えられた引数 opt が以下の条件をすべて満たすとき true を返し、そうでない場合は false を返す関数 isOptionsを作ります。

  • opt は配列であり、かつ長さが2である。
  • opt の2つの要素はともに以下を満たすオブジェクトである。
    • 2つのプロパティ namevalue を持ち、これらはともに値は文字列である。

ざっくりですがこんな感じのものです:

javascript

1const isOptions = opt => ( 2 Array.isArray(opt) && 3 opt.length === 2 && 4 opt.every( 5 e => ( 6 Object.keys(e).length === 2 && 7 [e.name, e.value].every(v => typeof v === 'string') 8 ) 9 ) 10);

2. 二つの配列がともにオプションであり、内容が等しい。

与えられた引数 opt1opt2 がともにオプションでありかつ内容が等しい場合に true を返し、そうでない場合は false を返す関数 optionsEqual を作成します。

javascript

1const optionsEqual = (opt1, opt2) => ( 2 [opt1, opt2].every(isOptions) 3 && 4 opt1.every( 5 (e, i) => ['name', 'value'].every(prop => e[prop] === opt2[i][prop]) 6 ) 7);

上記のような2つの関数を作っておくと、質問にある配列1をarr1 、配列2を arr2 として、以下によって最初にマッチしたオブジェクトのidである 3 が得られます。

javascript

1const matchObjId = arr2.find(({ selectedOptions: opt }) => optionsEqual(arr1, opt))?.id; 2console.log(matchObjId); // => 3

投稿2023/01/10 09:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

順番変わった場合に必ず合致したい可能性がある

の意味がわかりませんが、

javascript

1const a=[ 2 {name:"色",value:"赤"}, 3 {name:"個数",value:"30個"} 4]; 5 6const b=[ 7 { 8 id:1, 9 selectedOptions:[ 10 {name:"色",value:"赤"}, 11 {name:"個数",value:"10個"}, 12 ], 13 }, 14 { 15 id:2, 16 selectedOptions:[ 17 {name:"色",value:"赤"}, 18 {name:"個数",value:"20個"}, 19 ], 20 }, 21 { 22 id:3, 23 selectedOptions:[ 24 {name:"色",value:"赤"}, 25 {name:"個数",value:"30個"}, 26 ], 27 }, 28 { 29 id:4, 30 selectedOptions:[ 31 {name:"色",value:"黒"}, 32 {name:"個数",value:"10個"}, 33 ], 34 }, 35 ]; 36const c=b.filter(x=>JSON.stringify(x.selectedOptions)==JSON.stringify(a)).map(x=>x.id); 37console.log(c);

JSON.stringifyで合致しない具体的な例をあげていただければ調整します

投稿2023/01/10 06:43

yambejp

総合スコア114819

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

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

yambejp

2023/01/10 06:46

もし仮に以下のようなものを合致させたいとするなら { id:5, selectedOptions:[ {name:"個数",value:"30個"}, {name:"色",value:"赤"}, ], } のようなデータは配列として順番が違うので合致させないべきですが、どうしてもというならソートをかければ同じ順に並ぶので対応できそうです
yusuke1

2023/01/10 09:41

ソートかればいけそうですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問