Javascript 修剪JSON,同时保留节点结构和数组

Javascript 修剪JSON,同时保留节点结构和数组,javascript,arrays,json,Javascript,Arrays,Json,如何在保留节点结构和数组结构的同时,从JSON中删除除在不同级别指定的几个属性之外的所有内容 我研究了underline.js,它似乎没有那么多用于保存节点结构的细粒度控制。在下面的示例中,理想情况下,我希望能够指定“\u id”,“revisions[0]。\u id”,“revisions[0]。\u clienthaseview”作为保留这些属性的参数 当然有一个简单的方法可以做到这一点。以下是我想要的: 原创 { "_id": "50cbf5214ffaee8f0400000a"

如何在保留节点结构和数组结构的同时,从JSON中删除除在不同级别指定的几个属性之外的所有内容

我研究了underline.js,它似乎没有那么多用于保存节点结构的细粒度控制。在下面的示例中,理想情况下,我希望能够指定
“\u id”,“revisions[0]。\u id”,“revisions[0]。\u clienthaseview”
作为保留这些属性的参数

当然有一个简单的方法可以做到这一点。以下是我想要的:

原创

{
    "_id": "50cbf5214ffaee8f0400000a",
    "_user": "50b1a966c12ef0c426000007",
    "expenses": [],
    "name": "Untitled Project",
    "payments": [],
    "revisions": [
        {
            "_id": "50cbfae65c9d160506000007",
            "clientHasViewed": false,
            "comments": [],
            "dateCreated": "2012-12-15T04:21:58.605Z"
        },
        {
            "_id": "50cbfae65c9d160506000008",
            "clientHasViewed": false,
            "comments": [],
            "dateCreated": "2012-12-15T04:21:58.605Z"
        }
    ],
    "status": "Revised",
    "thumbURL": "/50cd3107845d90ab28000007/thumb.jpg"
}
修剪后的

{
    "_id": "50cbf5214ffaee8f0400000a",
    "revisions": [
        {
            "_id": "50cbfae65c9d160506000007",
            "clientHasViewed": false,
        },
    ],
}
ExtJs有一个函数(只有一个级别),但您可以创建与AngularJs类似的东西(angular有angular.copy,但它复制整个对象):

例如


对此,您可能会使用knockout投影:它目前既依赖于jQuery,也依赖于knockout(两者都是非常棒的库,但可能不适合您的要求)。不幸的是,依赖关系是knockout和jQuery,这对于我的生产项目来说是不可接受的,因为我使用的是Angular,我不认为它与knockout紧密集成,它只是用一些方法扩展了ko变量(这在很大程度上与ko的作用无关)。如果您去掉代码来处理可观察性(可能很容易识别),并且不介意jquery依赖性,那么这应该是一个简单的修复方法。您是说您只想提供修剪版本作为某个函数的参数吗?如果是这样,为什么不创建一个具有所需结构的对象并将其作为参数传递呢?不,我想在HTTP请求中返回修剪后的版本。我希望这个函数不需要我输入模板结构,因为我需要它来快速处理一堆具有不同结构的不同类型的对象。这很好,但是有没有办法递归地沿着树向下工作,并自动创建和填充
trimmed.revisions[]
而不是自己在下一行创建和填充它?我将向其中传递很多对象,每个对象都有一个完全不同的结构(数组中有很多数组),不可能为每个子数组构建每个对象。应该是可能的,但这会使函数更加复杂。
var copyTo = function(dest, source, names){
    names = names.split(/[,;\s]/);

    angular.forEach(names, function(name){
        if(source.hasOwnProperty(name)){
             dest[name] = source[name];
         }
     });
     return dest;
};
var trimmed = copyTo({}, original, '_id,');
    trimmed.revisions = [{}];
    trimmed = copyTo(trimmed.revisions[0], original.revisions[0], '_id,_clientHasViewed,');