入力が一貫している限り、これらの線に沿った何かがおそらくあなたのニーズに合うでしょう。「すべての角かっこを保持する」とおっしゃっていたのは知っていますが、出力が醜くなるので、代わりにかっこを修正することにしました。その部分は簡単に取り出せます。
function handleInput(str, input){
var inArray = str.split(' ');
inArray.forEach(function(v,i,a){
if(v.indexOf("C"+input) > -1){
if(v.indexOf('(') > -1 || v.indexOf(')') > -1)
inArray = fixParen(inArray, input, v, i);
else if(i+2 < a.length){
inArray.splice(i,2);
inArray = fixNumbers(inArray);
}
else
inArray.splice(i-1,2);
console.log(inArray.join(' '));
}
});
}
function fixParen(inArray, input, elem, index){
var elemArray = elem.split('');
var parenNumber = 0;
if(elem.indexOf('(') > -1){
elemArray.forEach(function(v){
if(v == '('){
parenNumber++;
}
});
for (var i = index+2; parenNumber > 0; i+=2){
var tempElem = inArray[i].split('');
var n = tempElem.indexOf(')');
if(n > -1){
tempElem.splice(n,1);
inArray[i] = tempElem.join('');
parenNumber--;
}
}
inArray.splice(index,2);
return fixNumbers(inArray);
}
else{
elemArray.forEach(function(v){
if(v == ')'){
parenNumber++;
}
});
for (var i = index-2; parenNumber > 0; i-=2){
var tempElem = inArray[i].split('');
var n = tempElem.indexOf('(');
if(n > -1){
tempElem.splice(n,1);
inArray[i] = tempElem.join('');
parenNumber--;
}
}
inArray.splice(index,2);
return fixNumbers(inArray);
}
}
function fixNumbers(inArray){
var count = 1;
inArray.forEach(function(v,i,a){
if(v.indexOf('C') > -1){
var tempElem = v.split('');
var n = tempElem.indexOf('C');
tempElem.forEach(function(val,ind,arr){
if(parseInt(val,10))
tempElem.splice(ind,1);
});
tempElem.splice(n+1,0,count);
inArray[i] = tempElem.join('');
count ++;
}
});
return inArray;
}
これは実際、見た目よりもはるかに単純な問題です。まず、文字列のすべての重要な部分が''で均等に区切られていることに注意してください。これにより.split(' ')
、すべての便利なパーツの素晴らしい配列を提供するために使用できます。次に、括弧は、C
必要なロジックの量を削減する要素にのみ付けることができます。次に、すべて(
に対応)
するある時点があり、括弧が一致する要素があると想定できるため、文字列の長さのテストを完全に無視できます。最後に、2つのケースしかありません。これは最後のC
要素であるため、直前に演算子を削除するか、最後ではなく、後に演算子を削除します。括弧はさておき、このためのロジックはかなり短いです。