如何将一些对象子包装在一个对象中?

时间:2013-06-07 16:56:21

标签: javascript gruntjs

concat之后我有javascript:

Tasks={a:1,b:2},Tasks.Test={a:1,b:2},Tasks.Test.TestA={a:1,b:2},Tasks.TestB={a:1,b:2};

但我想:

Tasks={a:1,b:2,Test:{a:1,b:2,TestA:{a:1,b:2}},TestB:{a:1,b:2}};

我怎么能用grunt做到这一点?

1 个答案:

答案 0 :(得分:0)

Minifiers不应该改变代码的执行方式。因此,如果您想要一个不同的结构,请以不同的方式构建您的对象。

我们假设你从这开始:

var Tasks = {a:1,b:2};
Tasks.Test = {a:1,b:2};

if (shouldIncludeTestA()) {
    Tasks.Test.TestA = {a:1,b:2};
}

if (shouldIncludeTestB()) {
    Tasks.TestB = {a:1,b:2};
}

现在构建这样的对象的唯一原因是,如果某些部分是动态的,那么它们可能会在运行时更改。例如,如果Tasks.Test.TestA有时是空白的,有时候是一个包含更多数据的对象。

因此,如果您拥有控制对象构建方式的代码,您显然无法将其压缩为单个对象文字,因为这意味着剥离控制对象创建方式的代码。

另一方面,如果您的对象每次都具有相同的结构,只需将其构建为单个对象文字,它将缩小为单个对象文字。

var Tasks = {
    a: 1,
    b: 2,
    Test: {
        a: 1,
        b: 2,
        TestA: {
            a: 1,
            b: 2
        }
    },
    TestB: {
        a: 1,
        b: 2
    }
};

压缩器/缩放器非常努力不改变代码的逻辑。因此,如果您的逻辑构建了一个包含多个语句的对象,那么您的缩小代码将包含多个语句

所以在我看来,你期望minifier做一些它永远不会做的事情,并且它永远不应该做