2014-05-23 140 views
0

我有一個JavaScript對象info,當我在Firebug控制檯做_(info).values(),我得到。從JavaScript中刪除的數據對象

[Object {}, Object { a=6, b=7, more...}, Object { a=2, b=21, more...}, Object {}, Object { a=2, b=9, more...}] 

因此,如何能我通過使用下劃線過濾器或任何其它有效的技術移除與Object {}從上述info對象物品?

回答

0

下劃線

_.pick(info, _.filter(_.keys(info), function(key) { 
    return _.keys(info[key]).length > 0; 
})); 

抽象成一個函數

_.filterObject = function(obj, callback) { 
    return _.pick(obj, _.filter(_.keys(obj), callback)) 
}; 

_.filterObject(info, function(key) { 
    return _keys(info[key]).length > 0; 
}) 

http://jsfiddle.net/mendesjuan/2kf8C/1/

說明

  • _.pick返回一個新的對象,只有在性傳遞

  • _.filter回報只是我們想要的屬性,有鑰匙

注意的是,那些本回報一個新的對象,它沒有修改原始

+0

這正是我一直在尋找,我沒有意識到我其實巢是這樣的方式。我正在使用拒絕,所以我想它可以在列表上工作,但不在對象上。順便說一句,如果我們談論效率或處理時間,你認爲哪種方法更好?假設數據元素在數百萬的範圍內。 – moleculeone

+0

@ user3670175我不能表現說話,因爲這取決於你如何使用它。最好的辦法是使用http://jsperf.com/自己測試,並報告任何問題/發現這裏的另一個問題。如果它正確回答您的原始問題,請接受這個答案。 –

1

的Javascript溶液:

var ob={a:{}, b:{ a:6}, c: { a:2}}; 
function removeEmpty(ob){ 
    for(var i in ob){ 
     if(typeof(ob[i])=='object'){ 
      var keys=Object.keys(ob[i]); 
      if(keys.length==0) delete ob[i]; 
     } 
    } 
} 
removeEmpty(ob); 
console.log(ob); // b:{a:6}, c{a:2} 
+0

這種運作良好,但一直在尋找的東西UND erscore,謝謝你。這和下劃線之間 – moleculeone

+0

最大的區別是下劃線解決方案創建一個新的對象,這個修改現有 –