2017-10-19 6 views
0

Je le tableau suivant:groupe Array par deux fois et compter occurences

var array = [ 
    { idOne: 1, oneText: 'one', idTwo: 2, twoText: 'two' }, 
    { idOne: 1, oneText: 'one', idTwo: 2, twoText: 'two' }, 
    { idOne: 12, oneText: 'twelve', idTwo: 23, twoText: 'twentythree' }, 
    { idOne: 12, oneText: 'twelve', idTwo: 23, twoText: 'twentythree' }, 
    { idOne: 12, oneText: 'twelve', idTwo: 25, twoText: 'twentyfive' }, 
    { idOne: 16, oneText: 'sixteen', idTwo: 56, twoText: 'fiftysix' }, 
    { idOne: 16, oneText: 'sixteen', idTwo: 56, twoText: 'fiftysix' }, 
    { idOne: 16, oneText: 'sixteen', idTwo: 56, twoText: 'fiftysix' }, 
    { idOne: 16, oneText: 'sixteen', idTwo: 50, twoText: 'fifty' }, 
    { idOne: 16, oneText: 'sixteen', idTwo: 50, twoText: 'fifty' }, 
    { idOne: 18, oneText: 'eighteen', idTwo: 90, twoText: 'ninety' } 
]; 

Je suis en train de les regrouper d'abord par Idone, puis par idTwo, et compter combien d'entre eux se trouvent, et puis trier les:

J'ai actuellement la méthode suivante:

var result = _.chain(array) 
    .groupBy("idOne") 
    .map(function(idOne, idOneKey) { 
     return _.chain(idOne) 
      .groupBy("idTwo") 
      .map(function(idTwo, idTwoKey) { 
       return {     
        id: idOneKey + '-' + idTwoKey 
       } 
      }) 
      .value(); 
    }) 
    .value(); 

Mais je veux retourner le tableau suivant ou un objet, pas sûr serait le mieux:

result = { 
    'one-two': 2, 
    'twelve-twentythree': 2, 
    'twelve-twentyfive': 1, 
    'sixteen-fiftysix': 3 
    ... 
} 

Il ne doit pas être avec underscore ou lodash, juste ce qu'il fonctionne.

+0

est une solution JS native permis? – RomanPerekhrest

+0

Je l'implémente dans une application de réaction, donc tout ce qui fonctionne vraiment ... –

+0

ne voudriez-vous pas un objet avec une structure comme: {[idOne]: {[idTwo]: {object}}}? essentiellement une carte de cartes pour les objets? – bryan60

Répondre

2

Vous pouvez utiliser countBy au lieu de groupBy:

let result = _.countBy(array, item => item.oneText + '-' + item.twoText); 
1

Ecamscript5 solution de rechange (basée sur Array.reduce() fonction):

var arr = [ 
 
    { idOne: 1, oneText: 'one', idTwo: 2, twoText: 'two' }, { idOne: 1, oneText: 'one', idTwo: 2, twoText: 'two' }, 
 
    { idOne: 12, oneText: 'twelve', idTwo: 23, twoText: 'twentythree' }, { idOne: 12, oneText: 'twelve', idTwo: 23, twoText: 'twentythree' }, 
 
    { idOne: 12, oneText: 'twelve', idTwo: 25, twoText: 'twentyfive' }, { idOne: 16, oneText: 'sixteen', idTwo: 56, twoText: 'fiftysix' }, 
 
    { idOne: 16, oneText: 'sixteen', idTwo: 56, twoText: 'fiftysix' }, { idOne: 16, oneText: 'sixteen', idTwo: 56, twoText: 'fiftysix' }, 
 
    { idOne: 16, oneText: 'sixteen', idTwo: 50, twoText: 'fifty' }, { idOne: 16, oneText: 'sixteen', idTwo: 50, twoText: 'fifty' }, 
 
    { idOne: 18, oneText: 'eighteen', idTwo: 90, twoText: 'ninety' } 
 
], 
 
result = arr.reduce(function(r, o){ 
 
    var k = o.oneText +'-'+ o.twoText; 
 
    r[k] = (r[k])? (r[k]+1) : 1; 
 
    return r; 
 
}, {}); 
 

 
console.log(result);

1

Vous pouvez utiliser un tableau pour les clés de groupe sur la table de hachage à compter.

var array = [{ idOne: 1, oneText: 'one', idTwo: 2, twoText: 'two' }, { idOne: 1, oneText: 'one', idTwo: 2, twoText: 'two' }, { idOne: 12, oneText: 'twelve', idTwo: 23, twoText: 'twentythree' }, { idOne: 12, oneText: 'twelve', idTwo: 23, twoText: 'twentythree' }, { idOne: 12, oneText: 'twelve', idTwo: 25, twoText: 'twentyfive' }, { idOne: 16, oneText: 'sixteen', idTwo: 56, twoText: 'fiftysix' }, { idOne: 16, oneText: 'sixteen', idTwo: 56, twoText: 'fiftysix' }, { idOne: 16, oneText: 'sixteen', idTwo: 56, twoText: 'fiftysix' }, { idOne: 16, oneText: 'sixteen', idTwo: 50, twoText: 'fifty' }, { idOne: 16, oneText: 'sixteen', idTwo: 50, twoText: 'fifty' }, { idOne: 18, oneText: 'eighteen', idTwo: 90, twoText: 'ninety' }], 
 
    result = {}; 
 

 
array.forEach(function (o) { 
 
    var key = ['oneText', 'twoText'].map(k => o[k]).join('-'); 
 
    result[key] = (result[key] || 0) + 1; 
 
}); 
 

 
console.log(result);