使用underscorejs过滤二维数组

时间:2012-10-31 14:09:13

标签: javascript underscore.js

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

 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
        )
..............

为了减少它,我想只保留其中包含零的项目,并省略带有零的项目。 像这样

    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;
    } )    ;

它有效,但我很确定,我没有得到最好的下划线。 任何人都可以建议更聪明的方式吗?

1 个答案:

答案 0 :(得分:2)

如果您不使用其返回值,请不要使用_.map,这只是_.each稍贵的版本。

就简化事情而言,你有点卡住,因为Underscore和JavaScript都想迭代数组并且你有嵌套对象(BTW,{ }对象文字在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/