レコード保存時に複数フィールドごとに半角・全角を指定変換したい

現在、フィールドごとに入力されている値を半角や全角に変換してから保存したいと考えております。

入力値チェックや半角⇔全角自動変換のプラグイン等の存在も存じ上げておりますが、

・エラー表示しかされず、項目ごとに再入力しなくてはいけない

・フィールドによって、半角英数字のみ、全角カタカナ/半角英数字、全て全角のみなど指定がバラバラ

・ユーザーは、気にせず入力できることを希望

といった問題もあるため、下記のようなJavascriptを書いているところです。

(function() {
'use strict';

   // ひらがな→カタカナ
   function replaceHiraToKana(str){
    return str.replace(/[\u3041-\u3096]/g, function(s){
     return String.fromCharCode(s.charCodeAt(0) + 0x60);
    });
   }
// 全角→半角(英数字)

~~~~~中略~~~~~
kintone.events.on(['app.record.create.submit',
'app.record.edit.submit'
], function(event) {
var record = event.record;
var group1 = [record.苗字.value, record.名前.value];

var newgroup1 = group1.map(function(Gr1){
return replaceHiraToKana(Gr1);
});
console.log(newgroup1);

for (var i = 0; i < group1.length; i++){
group1[i] = newgroup1[i];
}

return event;
});
})();

全てに指定変換を行うつもりはありませんが、フィールドが80近くあるため、下記のように1つずつ書くよりも、指定変換したいグループごとに処理できればと思っています。

record.苗字.value = replaceHiraToKana(record.苗字.value);

 

新しい配列(newgroup1)を作るところまではできているようでコンソールに出力されていますが、保存されても値が変更されません。エラーも出ていません。

どこをどう修正すべきかを教えていただけますでしょうか?

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

for(vari =0; i < group1.length; i++){
group1[i] = newgroup1[i];
}

group1の配列に入れても、フォームのデータには入っていないから保存されないのではないでしょうか?

record.苗字.value = 置換後の文字

のような処理が必要に思われます。

harada様

コメントありがとうございます。

vargroup1 = [record.苗字.value, record.名前.value];

としていても、やはり1つずつフィールドを拾い上げていくしかないということでしょうか?

となると

vargroup1 = [record.苗字.value, record.名前.value];

では、フィールドの値そのものではなく、フィールドコードを設定した方がフォームに置換後の値を戻すには便利かもしれません。

やはり1つずつフィールドを拾い上げていくしかないということでしょうか?

for文などを使って一括でするのが順当だとおもいます。

そのためには、いきなり値で取ってしまうと置き換えはできるけど戻しづらい。

フィールドコードで取っておけば、データを取って、置き換えして、戻すが楽になる可能性が高いです。

harada様

ありがとうございます。

いただいたアドバイスをもとに、下記のようにしたところ、理想通りの動きとなりました。

これで他のフィールドも指定変換を組み込んでいきたいと思います!

var group1 = ['回線契約者_苗字','回線契約者_名前'];

for (var i = 0; i < group1.length; i++){
var group1_value ={};
group1_value = record[group1[i]].value;
var newgroup1 = replaceHiraToKana(group1_value);
console.log(newgroup1);
record[group1[i]].value = newgroup1;
}

 

 

 

var group1_value ={};
group1_value = record[group1[i]].value;

がどうして動作するのか不思議でした。

試してみると、確かに動作しました。

{}でオブジェクトを作成していますが、変数にすれば良いと思われました。プロパティのないオブジェクトに値を入力できることが奇妙でした。

varではなく constで宣言するとプロパティのないオブジェクトではなく、変数の再代入として扱われるようで

Uncaught TypeError: Assignment to constant variable.

というエラーになりました。

var someobject = {}
console.log(typeof someobject)
// "object"
someobject = "aaa"
console.log(typeof someobject)
// "string"

になっているのですか。

harada様

正直、私自身まだまだ勉強中でして、細かい原理とかの理解は浅いと思います。

その上で、こちらを参考にして試したところ、動いてしまったというのが実際のところです。

{}でオブジェクトを作成していますが、変数にすれば良いと思われました。

これは、つまり、

vargroup1_value = record[group1[i]].value;

にするということでしょうか?

このままで問題ありそうであれば、修正したいので、具体的な記述コードを教えていただくことは可能でしょうか?

const group1 = ["回線契約者_苗字", "回線契約者_名前"];

for (const element of group1) {
record[element].value = replaceHiraToKana(record[element].value);
}

harada様

ありがとうございます!こんなにスマートになるんですね。

普段自分で書くときはvarしか使ってませんでしたので、constをはじめ、もう少し勉強していきます!

すみません。元のコードで問題ありません。

変数の機能でよさそうなところにでオブジェクトを使用していたので少し気になりました。

例えると原付バイクで行ける場所に、大型観光バスに一人しか乗らない、かつ、席には座らずトランクに乗るような使い方の「ちぐはぐ」がエラーにならなかった点が気になっただけです。処理スピードとかは問題にならないレベルだと思います。

replaceHiraToKana関数の引数が増えると、人間がコードを読み取る能力を阻害するので元コードのように一旦別の変数でデータを受けるべきです。

harada様

そうでしたか!

ご丁寧に何回もお付き合いいただいて、本当にありがとうございます。

とても勉強になりました。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。