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

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

ただいまの
回答率

89.10%

多重連想配列のfilter検索方法改善

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 93

JanTh1989

score 54

JavaScriptで配列データの検索機能実装を行おうとしております。
この配列は、多重連想配列になっており、1次元目のカラムと2次元目のカラム双方が一致する場合のデータを抽出するものになります。
この、2次元目の検索を行うデータの数が可変になります。
一旦動く処理にはしたのですが、filterしたのち、多重ループという有様でして・・・。
こちら、もう少し簡略化とかできないものなのでしょうか?

コード

//item_listからname先頭文字がsearch_name、かつcategoryのいずれかの情報に合致するものを抽出する.
function searchBunk_agent(item_list,category,search_name) {
    var item_result = [];
    var category_list = category.split(",");
    var search_name_Result = item_list.filter(function(value){
        return value.name.indexOf(search_name,0) == 0;
    });
    for(var i = 0; i < search_name_Result.length; i++){
        var val = search_name_Result[i];
        for(var j = 0; j < category_list.length; j++){
            if(val['category'] == category_list[j]){
                item_result.push('名前:' + val['name'] + 'カテゴリ:' + val['name']);
                break;
            }
        }
    }
}
item_list = [
    {"name":"みかん", "category":"00"},
    {"name":"みしん", "category":"01"},
    {"name":"みどり", "category":"02"}
];

期待値

パターン1
search_name:"み"
category:"00"
結果:”みかん”の要素情報がitem_resultにpushされる

パターン2
search_name:"み"
category:"00,02"
結果:”みかん”と"みどり"2つの要素情報がitem_resultにpushされる

filter1つのみで検索は完了。その後検索結果でループして、そこではpush実行のみ。
という処理にできれば、作るコード上は検索を何度もするものではなくなり、
見やすくなるのだろうか?と思っていたりします。
ただ、categoryが可変(OR条件が可変)になることへの対策方法が出てこず・・・。

私の方で挙げたコードが妥当な作りでは?や、上記のfilterでcategory可変対応をしても似たような処理をfilterに入れ込むだけだから大して変わらない、などももしありましたら、情報頂ければと思います。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

category_listのループをコードから消すならincludesを使えばよいと思いました。

また、item_listをfilterしなくてもよいなら、全件検索したほうがすっきりします。

function searchBunk_agent(item_list,category,search_name) {
    var item_result = [];
    var category_list = category.split(",");
    item_list.forEach(function(val){
        if(val['name'].startsWith(search_name) && category_list.includes(val['category'])){
            item_result.push('名前:' + val['name'] + 'カテゴリ:' + val['category']);
        }
    });
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/30 23:33

    forEach 内で item_result へ追加するんじゃなくて、filter して map した結果を直接 item_result へ代入した方がシンプルですね。

    const category_list = category.split(",");
    const item_result = item_list
    .filter(item => item.name.startsWith(search_name) && category_list.includes(item.category))
    .map(item => `名前: ${item.name} カテゴリ: ${item.category}`);

    キャンセル

  • 2020/07/01 14:39

    ご回答ありがとうございます。
    前者、後者共にコードがシンプルになりましたね。
    後者はなおシンプルです。
    includesもmapも使ったことがなかったので、そういう方法もあるのかと勉強になりました。
    後者側でやっていることを整理しつつ、コード改善してみようと思います。

    キャンセル

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる