、ちょうどので、同様にバックルートに横断:
(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"]}}"
回答の7%のようです。 – jAndy
@ Pointy:あなたは深刻ですか?問題が「オブジェクトからプロパティを削除する方法」であれば、はい、そうではありません。 – jAndy
おかげでtoby、しかし私はあなたが誤解したと思う。空の枝を取り除くためにオブジェクトを繰り返し処理するのが難しいです。配列内の空の文字列を削除すると、配列自体は空になりますが削除されません。 – Tom