2016-12-14 9 views
1

にネストされたキーの設定:キーごとが、私はこのようになりますオブジェクト持って虚偽

var access = { 
    main: false, 
    createCatalog: { 
    enterCatalogDetails: false, 
    selectProducts: true, 
    previewStyles: true, 
    previewLayout: false 
    }, 
    createBoard: { 
    enterBoardDetails: false, 
    selectProducts: false, 
    previewLayout: false 
    } 
} 

を、私はこの値をfalseに設定します。

は私がに反対する私は資産を合格した以下の機能を持っている:

function setInvalidObject (obj){ 
     var objCount = 0; 
     for(var p in obj){ 
     if(obj.hasOwnProperty(p)){ 
      objCount++; 
      setInvalidObject(obj[p]); 
     } 
     } 
     if(objCount === 0){ 
     obj = false; 
     } 
    } 

それは通じ実行しようとし、それが偽の鍵を設定する必要がどこに自分自身を呼び出します。問題は、途中まで上書きされているように見えます。なぜこれが起こっているのかわかりません。

答えて

1

プロパティがオブジェクトであるかどうかを確認してからオブジェクトを反復処理する必要があります。その後、ループを続行します。オブジェクトでない場合は、値をfalseに設定します。独自のプロパティのカウンタは必要ありません。

function setInvalidObject(obj) { 
 
    var objCount = 0; 
 
    for(var p in obj){ 
 
     if (obj.hasOwnProperty(p)) { 
 
      if (obj[p] && typeof obj[p] === 'object') { 
 
       setInvalidObject(obj[p]); 
 
       continue; 
 
      } 
 
      obj[p] = false; 
 
     } 
 
    } 
 
} 
 

 
var access = { main: false, createCatalog: { enterCatalogDetails: false, selectProducts: true, previewStyles: true, previewLayout: false }, createBoard: { enterBoardDetails: false, selectProducts: false, previewLayout: false } }; 
 

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

またはObject.keysを使用して、チェックhasOwnPropertyをスキップします。ファンタスティック

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

 
var access = { main: false, createCatalog: { enterCatalogDetails: false, selectProducts: true, previewStyles: true, previewLayout: false }, createBoard: { enterBoardDetails: false, selectProducts: false, previewLayout: false } }; 
 

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

+1

。ありがとうございました! – developthewebz

関連する問題