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 に答える