#分からないこと
htmlの配列データに対してtextContentを用いて取得した値を、String型の配列と比較していますが、値が一致しているはずなのにtrueになってくれません。
分かりづらいと思うので例を示します
html
1<div class= content> 2 <a class= content__letter>a</a> 3</div> 4<div class= content> 5 <a class= content__letter>b</a> 6</div> 7<div class= content> 8 <a class= content__letter>1</a> 9</div> 10<div class= content> 11 <a class= content__letter>2</a> 12</div>
jQuery
1function comparison(letter){ 2 const array = ["a", "c", "1", "3"] 3 var result = "" 4 5 if (array.includes(letter)){ 6 result = letter 7 } 8 9 return result 10} 11function main_function(){ 12 var letter 13 $(".content__letter").each(function (i, element){ 14 letter = element.textContent 15 result = comparison(letter) 16 console.log(result) 17 } 18}
jQueryのmain_functionが呼び出された時の動作として、ブラウザのコンソールにすべてresult=""のまま表示がなされます。
これはfunctionのcomparison中のif文の条件が常にfalseとなっていることから発生しています・
letterの中には、arrayに含まれる"a"や"1"があるにも関わらず、すべてfalseとなるのは、なぜでしょうか?
#仮説と検証
##変数の型が一致していない?
$.type()にて変数letterとarrayの要素の一部の型を調べました。
どちらもstringとなっていました。
##実際に文字列と比較できる?
console.log(letter == "a") ```を記述しました。 結果、eachの繰り返し中すべてfalseでした。
console.log(letter == "1")
ただし
console.log(letter == 1)
string型となっていたのになぜ? 配列の値を数字に数字の比較はできそうです。 が、アルファベットの方も比較したいので原因はまだ追求する必要があります。 textContentで取得した値は何か特殊な型となるのでしょうか? もしくは、代替案ございましたら教えていただけると幸いです。 よろしくお願いいたします。 #その他 ##開発環境 - OS macOS Catalina (10.15.4) - VScode (1.45) ##言語・gemのバージョン - ruby 2.5.1p57 - rails (5.2.4.2) - haml (5.1.2) - haml-rails (2.0.1) - mysql2 (0.5.3) - sass (3.7.4) - sass-rails (5.1.0) - jquery-rails (4.4.0) ##ソースファイル
$(function () {
function chord_display_relative(letter) {
// 略
}
//これがeach文の中で呼び出される関数です
function chord_display_absolute(key, letter, last_letter) {
if (/#|b|m/.test(key)) { minor_flag = 1; key = key.replace("m", ""); } const absolute_note_other_array = [ "Ab", "A#", "B#", "Cb", "D#", "E#", "Fb", "Gb", ]; var key_index = absolute_note_other_array.indexOf(key); if (key_index == 0) { key = "G#"; } else if (key_index == 1) { key = "Bb"; } else if (key_index == 2) { key = "C"; } else if (key_index == 3) { key = "B"; } else if (key_index == 4) { key = "Eb"; } else if (key_index == 5) { key = "F"; } else if (key_index == 6) { key = "E"; } else if (key_index == 7) { key = "F#"; } const absolute_note_array = [ "G", "G#", "A", "Bb", "B", "C", "C#", "D", "Eb", "E", "F", "F#", "G", "G#", "A", "Bb", "B", "C", "C#", "D", "Eb", "E", "F", "F#", ]; key_index = absolute_note_array.indexOf(key);
//const以下で定義されている配列が例のコードのarrayにあたります。
const relative_note_array1 = ["1", "2", "3"];
const relative_note_array2 = ["4", "5", "6", "7"];
var changed_index; const symbol_should_not_changed = ["|", "m", "{", "}", "@", "$", "t"]; const half_note_array = ["B", "b"]; var previous_index; var previous_note; var delete_flag = 0; changed_index = 0;
// 問題のif文
if (symbol_should_not_changed.includes(letter)) {
} else if (relative_note_array1.includes(letter)) {
changed_index = key_index + (letter * 2 - 2);
letter = absolute_note_array[changed_index];
} else if (relative_note_array2.includes(letter)) {
changed_index = key_index + (letter * 2 - 3);
letter = absolute_note_array[changed_index];
} else if (half_note_array.includes(letter)) {
previous_index = absolute_note_array.indexOf(last_letter);
delete_flag = 1;
if (letter == "B") previous_index = previous_index + 1;
if (letter == "b") previous_index = previous_index - 1;
if (previous_index == -1) {
previous_index = absolute_note_array.length - 1;
letter = absolute_note_array[previous_index];
}
} else {
letter = "";
}
var output = new Object(); output.letter = letter; output.delete_flag = delete_flag; return output;
}
//問題のメイン関数
function chord_display(key) {
var chord_text = $(".chord-display--text").text();
$(".chord_text__chord_letter").each(function (i, element) { var letter = $(".chord_text__chord_letter")[i].textContent; var last_letter; if (i == 0) { last_letter = ""; } else if (i > 0) { last_letter = $(".chord_text__chord_letter")[i - 1]; } var letter = element; letter = letter.textContent; console.log(letter); var output; if ( $(".key__key-display--relative-key").attr("style") == "display: flex;" ) { output = chord_display_relative(letter); } else if ( $(".key__key-display--relative-key").attr("style") == "display: none;" ) { output = chord_display_absolute(key, letter, last_letter); } else { output = chord_display_absolute(key, letter, last_letter); } $(".chord_text__chord_letter")[i].textContent = output.letter; });
}
続きは以下。ここから下で発火していますが、今回は余り関係がありません。 ```rails function absolute_key(note_selected, key_now_state) { const symbols = ["#", "b"]; if (symbols.includes(note_selected)) { if (/#|b|m/.test(key_now_state)) { key_now_state = key_now_state.slice(0, 8); } $(".key__key-display--now").text(key_now_state + note_selected); } else if (note_selected == "m") { if (/m/.test(key_now_state)) { } else { $(".key__key-display--now").text(key_now_state + note_selected); } } else { $(".key__key-display--now").text("key of " + note_selected); } } $(".key__key-display").on("touchend mouseup", function () { $(".chord-menu__key--palettes").show(); }); // 発火点 $(".palettes__palette").on("touchend mouseup", function () { var note_selected = $.trim($(this).text()); var key_now_state = $(".key__key-display--now").text(); key_now_state = $.trim(key_now_state); if (note_selected == "閉じる") { $(".chord-menu__key--palettes").removeAttr("style"); } else { if (note_selected == "移動ド") { $(".key__key-display--relative-key").css("display", "flex"); key_for_registration("relative-key"); } else { $(".key__key-display--relative-key").hide(); absolute_key(note_selected, key_now_state); key_now_state = $(".key__key-display--now").text(); key_for_registration(key_now_state); } chord_display(key_now_state); } }); // 発火点2 // ページ読み込み時の挙動 $(document).ready(function () { var key_now_state = $(".key__key-display--now").text(); key_now_state = $.trim(key_now_state); // absolute_key(note_selected, key_now_state); chord_display(key_now_state); key_for_registration(key_now_state); }); function key_for_registration(key_now_state) { if ($("#key_name").get(0) != undefined) { $("#key_name").val(key_now_state); } } });
haml
1.content__chord 2 - @song.chords.each do |chord| 3 - chord_array = chord.text.split(//) 4 .chord_text 5 - chord_array.each do |char| 6 %a.font_base.chord_text__chord_letter{value: char} 7 =char
↓変換後
html
1<!-- each文で表示される例。 --> 2<div class="chord_text"> 3 <a class="font_base chord_text__chord_letter" value="1">1</a> 4 <a class="font_base chord_text__chord_letter" value="#">#</a> 5 <a class="font_base chord_text__chord_letter" value="3">3</a> 6 <a class="font_base chord_text__chord_letter" value="b">b</a> 7</div>
他に必要な情報があれば教えて下さい。
回答1件
あなたの回答
tips
プレビュー