2016-05-19 14 views
2

複数の配列に分割したいオブジェクトの配列があります。 これらの文字列は、AngularJSで完璧に動作し、4つの配列私が望むように配列全体arrを分割:各項目におけるfilterValは常に0, 10, 50 or 60に等しいので、実際AngularJS:配列を配列に分割するフィルターを使用する

var arr0 = $filter('filter')(arr, { filterVal: 0 }, true); 
    var arr1 = $filter('filter')(arr, { filterVal: 10 }, true); 
    var arr2 = $filter('filter')(arr, { filterVal: 50 }, true); 
    var arr3 = $filter('filter')(arr, { filterVal: 60 }, true); 

は、総上記の4つの配列は、(元の配列です)。

したがって、上記のコードをもっと短くするにはどうすればよいですか?だから、私は別の言葉で

new_arr[0] is equal to arr0, 
new_arr[1] is equal to arr1, 
new_arr[2] is equal to arr2, 
new_arr[3] is equal to arr3. 

は、は、私は4つの文字列の代わりに(可能であれば)コードの1つの文字列を使用したいというように、1行にnew_arrにarrを分割する必要があります。 AngularJSで可能ですか?

このようにして、私はそれをよりダイナミックにします(4つに固執しないでください)。

ありがとうございます。

ちょうど追加: は例として、

arr = [ 
     {"code":"kfk", "flag":"dfmk", "filterVal": 0}, 
     {"code":"asg", "flag":"sdg3", "filterVal": 50}, 
     {"code":"asdf", "flag":"34t", "filterVal": 10}, 
     {"code":"hsdfh", "flag":"dfsg43", "filterVal": 50}, 
     ]; 

var new_arr[0] = [{"code":"kfk", "flag":"dfmk", "filterVal": 0}];//0s 
var new_arr[1]= [{"code":"asdf", "flag":"34t", "filterVal": 10},];//10s 
var new_arr[2]= [{"code":"asg", "flag":"sdg3", "filterVal": 50},{"code":"hsdfh", "flag":"dfsg43", "filterVal": 50}];//50s 
var new_arr[3]= [];//60s 
+0

元の配列と必要な結果を追加してください。 –

+0

@NinaScholzちょうど追加されました。ありがとうございました。 – Haradzieniec

答えて

1

グループ化にはプレーンなJavascriptと配列を使用できます。

var array = [{ "code": "kfk", "flag": "dfmk", "filterVal": 0 }, { "code": "asg", "flag": "sdg3", "filterVal": 50 }, { "code": "asdf", "flag": "34t", "filterVal": 10 }, { "code": "hsdfh", "flag": "dfsg43", "filterVal": 50 }, ], 
 
    groups = [{ filterVal: 0 }, { filterVal: 10 }, { filterVal: 50 }, { filterVal: 60 }], 
 
    result = groups.map(function (a) { return []; }); 
 

 
array.forEach(function (a) { 
 
    groups.some(function (b, i) { 
 
     var k = Object.keys(b)[0]; 
 
     return a[k] === b[k] && result[i].push(a); 
 
    }); 
 
}); 
 

 
console.log(result);

それとも、この程度

var array = [{ "code": "kfk", "flag": "dfmk", "filterVal": 0 }, { "code": "asg", "flag": "sdg3", "filterVal": 50 }, { "code": "asdf", "flag": "34t", "filterVal": 10 }, { "code": "hsdfh", "flag": "dfsg43", "filterVal": 50 }, ], 
 
    filter = [{ filterVal: 0 }, { filterVal: 10 }, { filterVal: 50 }, { filterVal: 60 }], 
 
    groups = Object.create(null), 
 
    result = filter.map(function (a) { return []; }); 
 

 
filter.forEach(function (b, i) { 
 
    groups[b[Object.keys(b)[0]]] = i; 
 
}); 
 
array.forEach(function (a) { 
 
    result[groups[a.filterVal]].push(a); 
 
}); 
 

 
console.log(result);

+0

ご迷惑をおかけして申し訳ありません。あなたのコードのように見える(たくさんの感謝)。私のコードが動作します。問題は、もっとコンパクトにすることが可能かどうかでした.4つではなく1つの行...とにかく私はあなたの答えをアップアップしています。再びありがとう。質問に答えるには – Haradzieniec

+0

、いいえ、本当にありません。 –

1

にconfertedされることが期待されるカスタムフィルタを作成します。

app.filter('groupify', function(){ 
    return function(list, key) { 
    return list.reduce((carry, row) => { 
     if (!carry[row[key]]) carry[row[key]] = []; 
     carry[row[key]].push(row); 
     return carry; 
    }, {}); 
    }; 
}); 

そして、それを使用します。

var new_arr = $filter('groupify')(arr, 'filterVal'); 

あなたがオブジェクト取得します:{0: [...], 10: [...], 50: [...], 60: [...]}
それはそれneccessary場合は、配列に変換するのは簡単ですが。

1

何より直線的なアプローチを使用することができますか?

var new_arr = [0, 10, 50, 60].map(function (n) { 
    return $filter('filter')(arr, { filterVal: n }, true); 
});