2016-08-15 7 views
-2

Javascriptオブジェクトのすべての要素を検索し、テキスト "???"たとえば、「***」と表示されます。JSONオブジェクトの要素のテキストを検索して置き換えますか?

JSONの例は以下のようになり

{ 
    "page-title": "Tasks", 
    "sections": [{ 
     "section-heading": "Work", 
     "subsections": [{ 
      "subsection-heading": "First", 
      "subsection-texts": [{ 
       "text": "This is some text." 
      }] 
     }, { 
      "subsection-heading": "Second", 
      "subsection-texts": [{ 
       "text": "This is some more text." 
      }, { 
       "text": "This is even more text ???." 
      }] 
     }, { 
      "subsection-heading": "Third ???", 
      "subsection-texts": [{ 
       "text": "This is the last text." 
      }] 
     }] 
    }] 
} 

あなたが見ることができるように、 "???"テキストは異なるレベルにある可能性があります。だから、$ ??? $の出現を "***"で検索して置き換える何らかの方法がありますか?

実際のJSONオブジェクトの要素をチェックするメソッドを探していますが、オブジェクトをstringifysして正規表現を使用するメソッドは必要ありません。これは効率的に行うことができますか?

+1

A JSONオブジェクトは誤った名称です。 JavaScriptオブジェクトまたはJSON文字列を意味しますか? – trincot

+0

@trincot ok私はJavascriptオブジェクトに変更しました。 – sonicboom

答えて

0

あなたは文字列のすべての疑問符を削減し、置き換え/マップで、すべてのオブジェクトのプロパティまたは配列のアイテムを反復処理することができます

var data = { ... } 

function replaceQuestionMarks(obj) { 
    if (Array.isArray(obj)) { 
     return obj.map(function(o) { 
      return replaceQuestionMarks(o); 
     }) 
    } else if (typeof obj === 'object') { 
     return Object.keys(obj).reduce(function(r, key) { 
      r[key] = replaceQuestionMarks(obj[key]); 
      return r; 
     }, {}) 
    } else if (typeof obj === 'string') { 
     return obj.replace('???', '***'); 
    } 
    return obj; 
} 

var replaced = replaceQuestionMarks(data); 
+0

ありがとう、それは素晴らしい作品です!私は、「???」の出現が複数ある場合、それを動作させることが可能かどうか疑問に思っていました。文字列に? – sonicboom

+1

@sonicboom確かにregexをreplace関数 'obj.replace(/ \?/ g、 '*');' – madox2

+0

に使ってみました。このコードは、JSONデータが文字列形式の場合に機能します。しかし、データがJavascriptオブジェクト(JSON.parseでデータ文字列を解析した後など)の場合、エラーが発生します。ReferenceError:replaceが定義されていません(...)。この行で発生します:r [key] = replace(obj [key]); – sonicboom

-3

一つのアプローチは、それを文字列に変換する正規表現で疑問符を交換して、オブジェクトに戻って解析することになります。

var myObject = {...}; 
myObject = (JSON.parse(JSON.stringify(myObject).replace(/\?\?\?/gi, '***'))); 

これは用語でそれを行うための最善の方法ではないかもしれませんパフォーマンスは向上していますが、実際に何を行っているかについてさらに詳しく知る必要があります。これは他のやり方と同じくらい効率的かもしれません。これを行う必要があるオブジェクトはどれぐらい大きくなっていますか?

+1

質問の最後の段落を読んでください。 – trincot

+0

haha​​ ...私はreadiingを終える前に答えを飛ばしたと思う。ただし、文字列「???」に一致するテキストを置換すると、何か他のものでは、手作業による解析または正規表現のいずれかの量が必要になります。このアプローチは、他のアプローチよりも効率的になる可能性があります。 – mcgraphix

+0

"手動で解析するか正規表現を使用するのはどういう意味ですか?オブジェクトのすべての値を調べて、オブジェクトを文字列として扱う必要がないように変更するだけで十分です。 – vlaz

関連する問題