2016-05-19 14 views
2

Es gibt ein Array von Objekten, die ich in mehrere Arrays aufteilen möchte. Diese Strings arbeiten perfekt in AngularJS und spaltete das gesamte Array arr in vier Arrays, wie ich will:AngularJS: Filter zum Teilen von Arrays in Arrays verwenden

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

die vier Arrays über insgesamt Eigentlich ist das Original-Array sind (weil filterVal in jedem Punkt immer gleich ist 0, 10, 50 or 60).

Also, die Frage ist, wie man den obigen Code kürzer machen? Also, ich brauche arr in new_arr in einer Zeile zu spalten, so dass

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. 

Mit anderen Worten, Ich mag würde eine Reihe von Code (falls möglich) anstelle von vier Saiten verwenden. Ist es mit AngularJS möglich?

So würde ich es dynamischer machen (nicht bei vier).

Vielen Dank.

Just added: Als Beispiel

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}, 
     ]; 

wird erwartet conferted in

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

fügen Sie bitte das ursprüngliche Array und das gewünschte Ergebnis hinzu. –

+0

@NinaScholz Gerade hinzugefügt. Vielen Dank. – Haradzieniec

Antwort

1

Sie könnten Javascript und ein Array für die Gruppierung verwenden.

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

Oder Sie könnten einen linearen Ansatz

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

Entschuldigung für das Reasking. Sieht so aus, als ob dein Code funktioniert (vielen Dank). Mein Code funktioniert. Die Frage war, ob es möglich ist, es kompakter zu machen - eine Zeile statt vier ... Wie auch immer, ich stimme für Ihre Antwort auf. Nochmals vielen Dank. – Haradzieniec

+0

um die Frage zu beantworten, nein, nicht wirklich. –

1

Erstellen von benutzerdefinierten Filter werden:

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

Und es verwenden:

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

Sie werden ein Objekt erhalten: {0: [...], 10: [...], 50: [...], 60: [...]}
Es ist einfach, es zu Array zu verwandeln, wenn es notwendig.

1

Was diese nutzen?

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