从javascript对象中删除多余的属性
Remove redundant properties from javascript object
可能重复:
如何从多深度JavaScript对象中删除Empty Properties?
我想从对象中删除所有空属性(包括空字符串数组(。
{ "someString" : "some text", "someObject" : { "array" : [ "", "" ] } }
例如,我想从这个示例对象中删除整个分支"someObject"。
我应该如何使用javascript进行此操作?
我可以编写一个函数,递归地迭代每个属性并删除空属性,但在上面的示例对象中,包含空字符串的数组不会被删除。
我应该很清楚,我希望编写一个递归函数,它将处理比示例更复杂的对象。任意组合的多级字符串、对象和数组。
问题是递归函数从顶部开始,向下遍历对象。因此,在一个非常长的(或冗余的(分支末尾的一个空字符串将被删除,但分支本身不会。
给定obj = (your object)
,使用delete obj.key
从中删除key
。
下面的代码分三次迭代对象的每个键。如果值是字符串,则键为空时将被删除。如果值是数组,则会迭代所有属性,并且只有当数组的所有成员都是空字符串时,才会删除键。如果该值是一个对象,则如果对同一函数的递归调用(即支持任何嵌套深度(返回一个没有键的对象,则键将被删除。
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);
到达底部后,只需遍历回根,如下所示:
(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"]}}"
使用delete
关键字
delete obj.someObject
相关文章:
- 使用php或javascript从facebook相册URL中删除多余的部分
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 全局变量和全局对象的属性之间有什么区别吗
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 序列化数据属性中对象的最可靠方法
- 分析高度属性时出现意外值{{specs.height}}.index.html
- TypeError:无法读取属性'推'未定义的JavaScript
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- AngularJS-使用'true'属性
- 可以't使用JavaScript获取width属性
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- JavaScript Pub/Sub属性访问问题
- 从JavaScript访问struts操作中的属性
- 是否可以从父类访问子类的属性
- 删除两个独立对象中的属性,而不使用多余的删除语句
- href属性之后的onclick属性是多余的吗
- TypeScript处理接口和类中多余属性的方式不同
- 从javascript对象中删除多余的属性