複数サブテーブルのループ効率化

お世話になります。

フォーム上に5つのサブテーブルがあり、そのサブテーブル内の判定区分として
「〇、△、×」から選択できるドロップボックスが1つずつ配置されています。
各サブテーブルごと行が何行か追加されていて、その行の△と×の数を
レコード追加/編集時にフォームの下部で集計、出力しています。

そこで最初のサブテーブル1のコードを書いて、動いてはいるのですが、
残り4つ分、コメントの★から★までをコピーして一部変更してペーストするという方法よりも

良い方法はないか今後サブテーブルが増える可能性がありますので、ご教示いただけますと幸いです。

またフィールドコードを配列などに入れる対応はエラーになり、うまく動きませんでした。

よろしくお願いいたします。

補足:
サブテーブルのフィールドコード:table_1,table_2,table_3,table_4,table_5
ドロップボックスのフィールドコード:judge_1,judge_2,judge_3,judge_4,judge_5
△の集計(文字列)のフィールドコード:cnt_triangle
×の集計(文字列)のフィールドコード:cnt_cross

参考:
https://developer.cybozu.io/hc/ja/community/posts/360043211712-フィールドコードを配列に入れてループ処理をしたい 

 

(function() {
    "use strict";

    var events = [
        'app.record.create.submit',
        'app.record.edit.submit'
    ];

    kintone.events.on(events, function(event) {
        var record = event.record;    
        var count = 0;
        var countTriangle = 0;
        var countCross = 0;

        // テーブルtable_1の列judge_1が△か×の場合、その個数をカウント

        // ★

        count = record.table_1.value.length;
        for( var i = 0; i < count; i++ ){
            if (record.table_1.value[i].value.judge_1.value=='△'){
                countTriangle = countTriangle+ 1
            }

            if (record.table_1.value[i].value.judge_1.value=='×'){
                countCross = countCross + 1
            }
        }

        // ★

        /* ここにテーブル2~5の判定もループも入る */

        record['cnt_triangle'].value = countTriangle
        record['cnt_cross'].value = countCross

        return event;

    });    

})();

ナツ様

お世話になっております。
トヨクモの江田と申します。

フィールドコードの箇所をドット形式でなく,ブラケット形式にすると良いと思います.

record.table_1.value[i].value.judge_1.value => record.[tableCode].value[i].value.[fieldCode].value

また,配列の要素に沿って繰り返し処理を行う場合は,for文を使わずにArrayオブジェクトのメソッドを使うと便利です.
下記あたりはよく使います.
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

(function() {
  "use strict";
  kintone.events.on([
    'app.record.create.submit',
    'app.record.edit.submit',
  ], function(event){
    var judgeFields = [{
      tableCode: 'table_1',
      fieldCode: 'judge_1'
    }, {
      tableCode: 'table_2',
      fieldCode: 'judge_2'
    },{
      tableCode: 'table_3',
      fieldCode: 'judge_3'
    },{
      tableCode: 'table_4',
      fieldCode: 'judge_4'
    },{
      tableCode: 'table_5',
      fieldCode: 'judge_5'
    }];
    var countFields = [{
      value: '△',
      fieldCode: 'cnt_triangle'
    }, {
      value: '×',
      fieldCode: 'cnt_cross'
    }];
    countFields.forEach(function(countField){
      event.record[countField.fieldCode].value = judgeFields.reduce(function(count, judgeField){
        return count + event.record[judgeField.tableCode].value.filter(function(row){
          return countField.value === row.value[judgeField.fieldCode].value;
        }).length;
      }, 0);
    });
    return event;
  });
})();

江田様

ご回答いただきありがとうございました。

参考サイトならびにソースコードの情報もありがとうございました。

後半のcountFields.forEach以下が参考サイトと異なりfunctionが混在するので現時点で理解できないのですが、

情報を参考にしつつ、ブレークポイントを配置しながら1つ1つ理解してみようと思います。

江田様

お世話になっております。

情報を参考にしたり、コードをデバッグしたりしたところ、時間は少々かかりましたが理解することができました。

他のコードにも汎用できそうです。

重ねて感謝申し上げます。