我目前正在設計一個GUI,允許用戶定義一些邏輯。我不希望它變得太複雜,所以我將它限制在一組括號內。所以,這個想法是檢查在開始和結束括號之間沒有任何其他開頭括號。Array.indexOf之間還是?
例如。 IF (a + b OR **(** b+ c)
將發生錯誤提示。
所以我用的路線決定:
- 找到的第一個開放式托架
- 找到的第一個右括號
- 使用這些指數之間的搜索和查找任何打開的支架
- 如果有任何開放括號被發現顯示一個錯誤
- 繼續循環的任何其他邏輯
這是代碼。我認爲它非常可怕,我相信必須有更好的方式來做到這一點。也許某種IndexOf。
<select rel="OpenBracket" id="open1">
<option value=""></option>
<option value="(">(</option>
</select>
Some True/Fale here
<select rel="CloseBracket" id="close1">
<option value=""></option>
<option value=")">)</option>
</select>
AND
<br />
<select rel="OpenBracket" id="open2">
<option value=""></option>
<option value="(">(</option>
</select>
Some True/Fale here
<select rel="CloseBracket" id="close2">
<option value=""></option>
<option value=")">)</option>
</select>
<button onclick="javascript:TestingRules();">Check</button>
function GetOpenBrackets() {
var openBracketArray = [];
jQuery('[rel="OpenBracket"]').each(function() {
if (jQuery(this).val() == "(") {
openBracketArray.push(jQuery(this).attr('id'));
} else {
openBracketArray.push(jQuery(this).val());
}
});
return openBracketArray;
}
function GetCloseBrackets() {
var closeBracketArray = [];
jQuery('[rel="CloseBracket"]').each(function() {
if (jQuery(this).val() == "(") {
closeBracketArray.push(jQuery(this).attr('id'));
} else {
closeBracketArray.push(jQuery(this).val());
}
});
return closeBracketArray;
}
function TestingRules() {
var openBrackets = GetOpenBrackets();
var closeBrackets = GetCloseBrackets();
var closeBracketIndex;
var openBracketIndex;
for (openBracketIndex in openBrackets) {
if (openBrackets[openBracketIndex] !== "") {
var foundCloseBracketIndex = -1;
for (closeBracketIndex in closeBrackets) {
if (openBracketIndex <= closeBracketIndex) {
if (closeBrackets[closeBracketIndex] !== "") {
foundCloseBracketIndex = closeBracketIndex;
break;
}
}
}
if (foundCloseBracketIndex > -1) {
var openBracketCheck;
for (openBracketCheck in openBrackets) {
if (openBracketIndex < openBracketCheck && closeBracketIndex >= openBracketCheck) {
if (openBrackets[openBracketCheck] !== "") {
alert('error');
}
}
}
}
}
}
// for testing:
// console.log(OpenBracketArray.length);
}
用這個作爲答案,因爲它是使用我最小的JS知識實現的最簡單的方法。另一篇文章可能非常有效,但我並不完全理解它。另外這是一個非常簡單明顯的解決方案。 – Piercy 2012-08-16 14:07:26
@Piercy它基本上和堆棧一樣,至少在計算parens方面。該堆棧還可以進行表達式評估 - 這是一個更通用的解決方案。不同之處在於inc/dec /數字比較與push/pop/stack size比較。 – 2012-08-16 14:19:24