2013-07-26 30 views
0

我需要从存储在数组中的对象中删除空属性,而不需要触摸原始数组。嵌套for循环,有没有更好的方法?

这里是我的代码:

// first I create a copy of the array 
parsedShapes = []; 
    for (var i in shapes) { 
    parsedShapes.push(shapes[i]); 
} 
// then for each objects in the new array, I delete all the empty attributes. 
for (var i in parsedShapes) { 
    var objects = parsedShapes[i]; 
    for (var j in objects) { 
    if (objects[j] === "") { 
     delete objects[j]; 
    } 
    } 
} 

此代码的工作,但我想知道是否有更好的方法来处理这个操作。

谢谢。

+0

使用'.map()'和'.forEach()'。 – SLaks

回答

1

,如果你不能改变“形状”的价值,我会尝试这样的事:

var parsedShapes = shapes.map(function(item){ 
    var obj = {}; 
    for(var i in item){ 
     if(item[i] || (item[i]===false || item[i]===0)){ obj[i] = item[i]; } 
    } 
    return obj 
}); 

这种方式,您只需要通过“形状做一个周期'而不必迭代'形状'来创建'parsedShapes'然后遍历'parsedShapes'来删除空白。

if(item[i] || (item[i]===false || item[i]===0)){ obj[i] = item[i]; } 

这将清除任何“null”或“”值。我假设具有值'0'或'假'的东西不被认为是“空的”。

注意 filter()仅适用于一个数组。所以,如果集合中的项目是对象,那么使用filter()将无法工作。

+0

谢谢!这正是我需要的。 – Julian

1

要创建一个数组的一个副本,只是这样做:

var newArray = oldArray.slice(0); 

那一边,我真的不能相信任何过滤掉空值更简单的方法,不仅仅是在没有他们还有其他第一个地方。

+0

谢谢,我至少可以删除一个循环 – Julian

0

你可能做到这一点与filter功能,如:

var filtered = object_filter(parsedShaped, function (key, shape) { 
    return shape !== ""; 
}); 

如果过滤器是一样的东西:

function object_filter(array) { 
    var result = {}; 
    object_map(object, function (key, value) { 
     if (filter_function(key, value)) { 
      result[key] = value; 
     } 
    }); 
    return result; 
} 

大多数框架都会有这样的功能。如果不是,写自己的:)