これは、ここで回答したjQuery - Find Value Based on Input and Lookup Tableに対するフォローアップの質問です。
そのソリューションは完全に機能しました。ただし、未解決の問題が 1 つあります。
ルックアップ テーブルにはダッシュが含まれており、その後の計算には数値が必要です。だから私がやりたいことは、(1)適切なtdを見つけた後、(2)それが数字であることを確認したい、(3)そうならそれを使う、(4)そうでなければそれを使う番号が見つかるまで、同じ列の前の行。(5) 見つかった場合は、チェックを停止します。(6) 番号が見つからない場合は、メッセージを表示します。
これが私が得た距離です:
jQuery.fn.reverse = [].reverse;
function GetTableValue(column, value, table) {
var smallestdiff = 0;
var savedindex = 0;
$(table).find('td:first-child').reverse().each(function(i) {
diff = parseFloat($(this).text(),10) - value;
if (diff >= smallestdiff) {
smallestdiff = diff;
savedindex = 12 - i;
return false;
}
});
tr = $(table).find('tr:eq('+ savedindex +')');
$(".scc-round").val( tr.find('td:first-child').text() );
var cell_value = tr.find('td:nth-child('+ column +')').text();
if( isNaN(cell_value) ) {
savedindex = savedindex - 1;
}
// this is as far as I've gotten
new_ie_value = tr.find('td:nth-child('+ column +')').text();
}
例: 下の表を使用すると、数が 1 (5 以下) で、列が 1 (1 列を超える) の場合、「-」が得られます。次の数字「0.6」に行きたいと思います。
私のアプローチは、行の値(savedindex)から減算して上にトラバースすることでしたが、書き方がわかりません。さらに、単純化できると確信している大量のコーディングを終了しました。
例の表:
<table id="ms25">
<tr>
<td>20</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>4.6</td>
</tr>
<tr>
<td>15</td>
<td>1.2</td>
<td>1.2</td>
<td>0.8</td>
<td>0.8</td>
<td>0.6</td>
<td>3.5</td>
</tr>
<tr>
<td>10</td>
<td>0.8</td>
<td>0.8</td>
<td>0.5</td>
<td>0.5</td>
<td>0.4</td>
<td>2.3</td>
</tr>
<tr>
<td>7.5</td>
<td>0.6</td>
<td>0.6</td>
<td>0.4</td>
<td>0.4</td>
<td>0.3</td>
<td>1.8</td>
</tr>
<tr>
<td>5</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>1.2</td>
</tr>
</table>
ヘルプ/指示をいただければ幸いです。
ありがとう。
-スティーブン
アップデート:
私は解決策を思いつきました。他の人を助けることができる場合に備えて、私のソリューションを投稿してください。
function GetTableValue(column, value, table) {
smallestdiff = Number.MAX_VALUE;
var savedindex = 0;
$(table).find('td:first-child').each(function(i) {
diff = parseInt($(this).text(),10) - parseInt(value, 10);
if (diff >= 0 && diff < smallestdiff) {
smallestdiff = diff;
savedindex = i;
}
});
tr = $(table).find('tr:eq('+ savedindex +')');
$(".scc-round").val( tr.find('td:first-child').text() );
new_ie_value = tr.find('td:nth-child('+ column +')').text();
// only a few are not numbers, so i'll do a quick check
if(isNaN(parseFloat(new_ie_value, 10))) {
$(table).find('tr').each(function(i){
if(isNaN(parseFloat(new_ie_value, 10))) {
savedindex = savedindex - 1;
}
tr = $(table).find('tr:eq('+ savedindex +')');
$(".scc-round").val( tr.find('td:first-child').text() );
new_ie_value = tr.find('td:nth-child('+ column +')').text();
});
}
// it's possible that the top td is still not a number
if(isNaN(parseFloat(new_ie_value, 10))) {
$(".scc-round").val("call");
}
}
これはより効率的であると確信していますが、機能します。