0

我在 javascript 中有这个数组:你可以在这里看到

 Array
(
    [2012-10-01] => Array
        (
            [1] => 1
            [2] => 0

...
            [148] => 0
            [149] => 0
            [150] => 1
        )

[2012-10-02] => Array
        (
            [1] => 0
            [2] => 1

...
            [148] => 0
            [149] => 1
            [150] => 0
        )

[2012-10-03] => Array
        (
            [1] => 1
            [2] => 0

...
            [148] => 0
            [149] => 0
            [150] => 1
        )
..............

为了减少它,我想只保留具有 1 的项目并省略具有 0 的项目。像这样

    Array
(
    [2012-10-01] => Array
        (
            [23] => 1
            [64] => 1
            [70] => 1
            [73] => 1
            [76] => 1
            [108] => 1
            [138] => 1
        )

我使用了 underscorejs 和这段代码:

 var new_o={};
    var v = _.each(original_array,function(day,key){
        var arr = {};
        _.map(day,function(item,k){
             if (item){
                 arr[k]=item;
             }
        }) ;

        new_o[key]= arr;
    } )    ;

它有效,但我很确定,我没有得到最好的下划线。有人可以提出更聪明的方法吗?

4

1 回答 1

2

如果你不_.map使用它的返回值就不要使用,那只是稍微贵一点的_.each.

就简化而言,您有点卡住了,因为 Underscore 和 JavaScript 都确实想要遍历数组并且您有嵌套对象(顺便说一句,在 JavaScript 中{ }是一个对象文字[ ],是一个数组,它们完全不同)。可能对当前数据结构能做的最好的事情就是_.reduce在携带新的子对象的同时迭代子对象;像这样的东西:

var new_o = { };
_.each(original, function(day, key) {
    new_o[key] = _(day).reduce(function(memo, item, k) {
        if(item)
            memo[k] = item;
        return memo;
    }, { });
});

演示:http: //jsfiddle.net/ambiguous/FZRV3/

于 2012-10-31T16:30:16.257 回答