2017-10-22 6 views
1

私の目標は、calc(string)関数に渡される文字列は、その式の内部で操作を実行するために"expr"という名前のキーを持っている場合、私はそれをしたいと思い、オプションreviver argumentJSON.parse機能を伝えることです、残りの文字列を操作するために外側を続けます。JSON.parseリバイバー機能ネストされたオブジェクト

これを実行するたびに、私はNaNを取得しています。

console.log(initNumber)の前に2つの最後のcalc(string)コールをコメントアウトすると、プログラムは正常に実行されます。

したがって、キーが"expr"で、ネストされたキーの値が"add"の場合、そのネストされたオブジェクトに対してadd()関数を実行します。 "op"キーが"subtract"の場合も同様です。

非常に助かります。

var initNum = 0; 

var calc = function(string) { 
    var calcString = JSON.parse(string, reviver); 

    add(calcString); 
    subtract(calcString); 
}; 

var add = function(string) { 
    if (string["op"] == "add") { 
    var numString = parseInt(JSON.stringify(string["number"])); 
    initNum = numString + initNum; 
    return initNum; 
    } 
} 
var subtract = function(string) { 
    if (string["op"] == "subtract") { 
    var numString = parseInt(JSON.stringify(string["number"])); 
    initNum = initNum - numString; 
    return initNum; 
    } 
} 

var reviver = function(key, val) { 
    if (key == "expr") { 
    if (val.op == "add") { 
     return add(val); 
    } 
    else if (val.op == "subtract") { 
     return subtract(val); 
    } 
    } 
    else { 
     return val; 
    } 
}; 

calc('{"op" : "add", "number" : 5}'); 
calc('{"op" : "subtract", "number" : 2}'); 
calc('{"op" : "add", "number" : 19}'); 
calc('{"op": "subtract", "expr" : {"op" : "add", "number" : 15}}'); 
calc('{"op": "add", "expr" : {"op" : "add", "expr" : {"op" : "subtract", "number" : 3}}}'); 
console.log(initNum); 

答えて

1

いくつかのポイント:

  • reviverはあなたに既に解析された値を与える、あなたがそれらを再度解析する必要はありません。
  • exprを値に変換すると、addsubtractの関数では、これらの値を読み取ることができる必要があります。numberではなく、別のロジックを使用すると思います。だからこそ私はoperandを以下のようにしています。いずれにしても、number引数がない可能性があることを認識し、それを処理する必要があります。
  • あなたがNaNを取得した理由は、あなたがあなたの計算を破ったundefinedを与える、(expr Sを復活した結果)1を持っていなかったオブジェクトからnumberを取得しようとしていた上述のです。

基本的に、あなたがそれを処理する必要があるので、あなたは、表現を復活後

{"op": "subtract", "expr" : {"op" : "add", "number" : 15}}

{"op": "subtract", "expr" : 37}

に行くことを覚えておいてください。

var initNum = 0; 
 

 
var calc = function(string) { 
 
    var calcObj = JSON.parse(string, reviver); 
 

 
    add(calcObj); 
 
    subtract(calcObj); 
 
}; 
 

 
var add = function(obj) { 
 
    if (obj["op"] == "add") { 
 
     var operand = (obj["number"])? obj["number"] : obj["expr"]; 
 
     initNum = operand + initNum; 
 
     console.log("running total : "+initNum); 
 
     return initNum; 
 
    } 
 
} 
 
var subtract = function(obj) { 
 
    if (obj["op"] == "subtract") { 
 
     var operand = (obj["number"])? obj["number"] : obj["expr"]; 
 
     initNum = initNum - operand; 
 
     console.log("running total : "+initNum); 
 
     return initNum; 
 
    } 
 
} 
 

 
var reviver = function(key, val) { 
 
    if (key == "expr") { 
 
    if (val.op == "add") { 
 
     return add(val); 
 
    } 
 
    else if (val.op == "subtract") { 
 
     return subtract(val); 
 
    } 
 
    } 
 
    else { 
 
     return val; 
 
    } 
 
}; 
 

 
calc('{"op" : "add", "number" : 5}'); 
 
calc('{"op" : "subtract", "number" : 2}'); 
 
calc('{"op" : "add", "number" : 19}'); 
 
calc('{"op": "subtract", "expr" : {"op" : "add", "number" : 15}}'); 
 
calc('{"op": "add", "expr" : {"op" : "add", "expr" : {"op" : "subtract", "number" : 3}}}'); 
 
console.log(initNum);

+0

ありがとうございました。それでは、今やもっと意味が分かります。したがって、varオペランドの部分では、「JSONオブジェクトに「数字」キーがある場合はそれを使用し、そうでなければ「expr」キーを使用してください。ありがとうありがとう。 – giggidy

+0

'JSONオブジェクトに「数字」キーがある場合はそれを使用し、そうでない場合は「expr」キーを使用します。そして、最も復活したプロパティから始めて 'reviver'が[定義されています](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Using_the_reviver_parameter)が動作するため、すべての 'expr'はそれらを取り囲む' add'または 'subtract'演算によって見られる時にすでに値に変換されているはずです。 –

+0

華麗です。完全に意味をなさない:) – giggidy

関連する問題