2011-11-14 5 views
1

可能性の重複から冗長なプロパティを削除:
JavaScriptのオブジェクト

How to remove Empty Properties from a multi depth JavaScript Object?

Iは、物体側から(空の文字列のアレイを含む)すべての空のプロパティを削除したいです。

{ "someString" : "some text", "someObject" : { "array" : [ "", "" ] } } 

など。私はこのサンプルオブジェクトからブランチ "someObject"全体を削除したいと思います。

javascriptでこれを行うにはどうすればよいですか?

空の文字列を含む配列の上の例のオブジェクトでは、再帰的に各プロパティを反復して空のものを削除する関数を記述できます。

私はこの例よりもはるかに複雑なオブジェクトを扱う再帰関数を書くことにしています。さまざまなレベルの文字列、オブジェクト、配列。

問題は、再帰関数が先頭から始まり、そのオブジェクトを通って下へ移動することです。したがって、非常に長い(それ以外の場合は冗長な)ブランチの末尾にある空の文字列は削除されますが、ブランチ自体は削除されません。

答えて

0

はそれからkeyを削除するためにdelete obj.keyを使用し、obj = (your object)考える

delete obj.someObject 
+5

回答の7%のようです。 – jAndy

+0

@ Pointy:あなたは深刻ですか?問題が「オブジェクトからプロパティを削除する方法」であれば、はい、そうではありません。 – jAndy

+0

おかげでtoby、しかし私はあなたが誤解したと思う。空の枝を取り除くためにオブジェクトを繰り返し処理するのが難しいです。配列内の空の文字列を削除すると、配列自体は空になりますが削除されません。 – Tom

1

deleteキーワードを使用します。

以下のコードは、3回のパスでオブジェクトのすべてのキーを繰り返します。値が文字列の場合、キーは空であれば削除されます。値が配列の場合、すべてのプロパティが反復され、配列のすべてのメンバーが空の文字列である場合にのみキーが削除されます。値がオブジェクトの場合、同じ関数を再帰的に呼び出す(つまり、ネスティングの深さをサポートする)キーがないオブジェクトを返す場合、キーは削除されます。底部に到達した後

function removeEmptyStrings(obj) { 
    for(var key in obj) { 

     // value is empty string 
     if(obj[key] === '') { 
     delete obj[key]; 
     } 

     // value is array with only emtpy strings 
     if(obj[key] instanceof Array) { 
     var empty = true; 
     for(var i = 0; i < obj[key].length; i++) { 
      if(obj[key][i] !== '') { 
       empty = false; 
       break; 
      } 
     } 

     if(empty) 
      delete obj[key]; 
     } 

     // value is object with only empty strings or arrays of empty strings 
     if(typeof obj[key] === "object") { 
     obj[key] = removeEmptyStrings(obj[key]); 

     var hasKeys = false; 
     for(var objKey in obj[key]) { 
      hasKeys = true; 
      break; 
     } 

     if(!hasKeys) 
      delete obj[key]; 
     } 
    } 

    return obj; 
} 

// invoke  
var test = { "someString" : "some text", "someObject" : { "array" : [ "", "" ] } }; 
removeEmptyStrings(test); 
+0

これは、非常に特定の浅い構造化オブジェクトに対してのみ機能するという問題があります。オブジェクト内の配列内の空の文字列については何もしません。 – Tom

+0

@tom:コードスニペットの下にある私のコメントはそれを扱います。おそらく、私は明日そのことに行く機会を得るでしょう。 –

+0

@Tom:この質問は今閉じていますが、それが価値あるものであれば、私は答えを更新しました。リンクされた質問の受け入れられた答えはもう少し簡潔ですが... –

1

、ちょうどので、同様にバックルートに横断:

(function() { 
    Object.removeEmptiness = removeEmptiness; 

    function isArray(obj) { 
     return obj && Object.prototype.toString.call(obj) === "[object Array]" || false; 
    } 

    function isObject(obj) { 
     return obj && typeof obj == "object" || false; 
    } 

    function removeEmptiness(root, undef) { 
     var removeProps; 
     removeProps = function (obj, key, parent) { 
      var i, isFullyEmpty = true, 
       value; 
      if (isArray(obj)) { 
       //.length not cached on purpose 
       for (i = 0; i < obj.length; ++i) { 
        value = obj[i]; 
        if (isObject(value)) { 
         removeProps(value, i, obj); 
         isFullyEmpty = false; 
        } else if (value === "" || value === undef) { 
         obj.splice(i--, 1); 
        } else { 
         isFullyEmpty = false; 
        } 
       } 
      } else { 
       for (i in obj) { 
        value = obj[i]; 
        if (isObject(value)) { 
         removeProps(value, i, obj); 
         isFullyEmpty = false; 
        } else if (value === "" || value === undef) { 
         delete obj[i]; 
        } else { 
         isFullyEmpty = false; 
        } 
       } 
      } 
      if (key !== undef && isFullyEmpty) { 
       delete parent[key]; 
       removeProps(root); 
      } 
     }; 
     removeProps(root); 
     return root; 
    } 
})(); 

テスト "スイート":

var obj = { "someString" : "some text", "someObject2" : {"k":"", "v": ["k"] }, "someArray3": [{}, ["","",""] ], "someObject" : { "array" : [ "", "", {"hello": ["",""] } ] } }; 
Object.removeEmptiness(obj); 
console.log(JSON.stringify(obj)); 

//"{"someString":"some text","someObject2":{"v":["k"]}}" 
+0

Esailija、あなたの最近の編集は論理を変更しましたか? – sandinmyjoints

+0

@sandinymyjoints私は[jsbeautifier](http://jsbeautifier.org/)を実行しました...私は恐ろしいくぼみ= Dを持っていた – Esailija

関連する問題