2012-04-25 126 views
1

是否有一种方便的方法来过滤bigObject只有在filterInterface中定义的属性才能获得filteredObject作为输出?如何根据过滤器对象过滤对象

大对象有很多属性,我想剥离信息到我需要的属性(将它保存到某处,不想/不能保存完整的对象)。

I prepared the following code as a jsfiddle here.

// My big object 
var bigObject = { 
    prop1: { 
     prop2: { 
      prop3: 123, 
      prop4: 456, 
      prop5: "TEST"    
     }, 
     prop6: 789, 
     prop7: "xxx" 
    }, 
    prop8: 5.6, 
    prop9: 3  
}; 

// My "interface" to filter the object 
var filterInterface = { 
    prop1: { 
     prop2: { 
      prop3: true, 
     }, 
     prop7: true 
    }     
}; 

// My expected result, only the properties of 
// big Object which match the interface 
var filteredObject = { 
    prop1: { 
     prop2: { 
      prop3: 123, 
     }, 
     prop7: "xxx" 
    }     
}; 

回答

1

简单地说,我希望是这样的:

var filteredObject = {} 

for (var key in filterObject) { 
    if (bigObject.hasOwnProperty(key)) { 
    filteredObject[key] = bigObject[key]; 
    } 
} 

包括递归,如果你想 “深” 过滤:

function filter(obj, filterObj) { 
    var newObj = {}; 

    for (var key in filterObj) { 

    if (obj.hasOwnProperty(key)) { 

     if (typeof obj[key] == 'object' && typeof filterObj[key] == 'object') { 
     newObj[key] = filter(obj[key], filterObj[key]); 

     } else { 
     newObj[key] = obj[key]; 
     } 
    } 
    } 
    return newObj; 
} 


var o = filter(bigObject, filterInterface); 

alert(o.prop1.prop7); // 'xxx' 
alert(o.prop1.prop9); // undefined 
+0

完美,完蛋了。谢谢! – Marc 2012-04-25 09:07:13