2017-03-27 5 views
1

私は以下のようなオブジェクト内に存在するすべてのプロパティ/サブプロパティ上で実行する必要がsanitizeStr()機能があります。問題は、これらのプロパティのすべての単一の1のために、彼らはよく、またはかもしれないということです複雑なオブジェクトのすべての文字列値をサニタイズしますか?

const data = { 
    info: 'schools', 
    schools: [ 
    { name: 'Johnson Elementary', type: 'elementary' }, 
    { name: 'Iselin Middle School', type: 'middle' } 
    ], 
    bestStudent: { 
    name: 'John', 
    grade: 'sixth' 
    } 
}; 

を存在しない。今、私が各プロパティに対して複数のifのチェックを行うことを抱えていると、手動で機能を実行している:

// Is there a better way to do this rather than what I have here: 

if (data.info) { 
    data.info = sanitizeStr(data.info); 
} 

if (data.bestStudent) { 
    if (data.bestStudent.name) { 
    data.bestStudent.name = sanitizeStr(data.bestStudent.name); 
    } 

    if (data.bestStudent.grade) { 
    data.bestStudent.grade = sanitizeStr(data.bestStudent.grade); 
    } 
} 

if (data.schools) { 
    data.schools.forEach((school, i) => { 
    if (school.name) { 
     data.schools[i].name = sanitizeStr(school.name); 
    } 

    if (school.grade) { 
     data.schools[i].grade = sanitizeStr(school.grade); 
    } 
    }); 
} 

誰もがこれを行うためのクリーナー/以下、マニュアルの方法を知っている場合は、それをいただければ幸いです。

+0

'sanitizeStr'は何をしているのですか?機能を追加してください。 –

+0

私はそれがかなり関連しているとは思わないので、私はそれを含めなかった - それはちょうどいくつかの文字列の置換を行います。私は基本的には、手動で1つずつ行う必要なしに、すべてのプロパティでその関数を実行するためのより良い方法を見つけようとしています。 – saadq

+0

[オブジェクトのプロパティを反復する]の複製があります。(0120-18751) –

答えて

3

オブジェクトに対して反復および再帰的アプローチを使用し、非オブジェクトのみの関数を呼び出すことができます。

function sanitizeStr(s) { 
 
    return '#' + s; 
 
} 
 

 
function iterAll(object) { 
 
    Object.keys(object).forEach(function (k) { 
 
     if (object[k] && typeof object[k] === 'object') { 
 
      iterAll(object[k]); 
 
      return; 
 
     } 
 
     object[k] = sanitizeStr(object[k]); 
 
    }) 
 
} 
 

 
var data = { info: 'schools', schools: [{ name: 'Johnson Elementary', type: 'elementary' }, { name: 'Iselin Middle School', type: 'middle' }], bestStudent: { name: 'John', grade: 'sixth' } }; 
 

 
iterAll(data); 
 

 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

数字を消毒するのを避けるために文字列を明示的にチェックして、文字列に変換することができます。いずれにしても+1。 –

+0

私のコードのこの時点で、プロパティが存在する場合は文字列であることが保証されていますが、他の誰かがこれを見ている場合には便利なコメントです。そして、ありがとう、私はこのようなアプローチで行くことができると思う。 – saadq

関連する問題