2017-05-02 5 views
0
[ 
    { 
    assigned_user:{ 
      name:'Paul', 
      id: 34158 
     }, 
    doc_status: "processed" 
    }, 
    { 
     assigned_user:{ 
      name:'Simon', 
      id: 48569 
     }, 
    doc_status: "processed" 
    }, 
    { 
     assigned_user:{ 
      name:'Simon', 
      id: 48569 
     }, 
    doc_status: "processed" 
    } 
]; 

Sagen wir, ich habe das obige Array.Zählen nach eindeutigen Schlüssel

ich für eine Funktion suchen, die, wie oft wir begegnen sich unqiue Benutzer zählen können, und dann das Ergebnis in einem anderen Array drücken:

Also, ich möchte so etwas bekommen:

[ 
    { 
    user:"Simon", 
    count: 2 
    }, 
    { 
    user: "Paul", 
    count: 1 
    } 
]; 

Irgendwelche Ideen?

Ich versuchte zu lösen, indem ich alle einzigartigen Benutzer nahm und dann die Zeiten zählte, die jeder von ihnen in meinem Array erscheint, aber ich konnte es nicht herausbekommen.

+0

Post Code bitte. –

+0

Ich denke an lodash '[xorBy] (https://lodash.com/docs/4.17.4#xorBy). Keine Ahnung... – Chay22

Antwort

0

ECMAScript5 Lösung (Array.prototype.reduce() und Array.prototype.map() Funktionen):

var arr = [ 
 
     {assigned_user:{name:'Paul',id: 34158},doc_status: "processed"}, {assigned_user:{name:'Simon',id: 48569},doc_status: "processed"}, {assigned_user:{name:'Simon',id: 48569},doc_status: "processed"} 
 
    ]; 
 

 
var counts = arr.reduce(function (r, o) { 
 
    var user = o.assigned_user.name;  // getting reference to username 
 
    (r[user])? ++r[user] : r[user] = 1; // accumulating username occurrences 
 
    return r; 
 
}, {}), 
 
    // costructing the final structure `user`:`count` 
 
    result = Object.keys(counts).map(function (k) { 
 
     return {user: k, count: counts[k]}; 
 
    }); 
 

 
console.log(result);

0

const a = [{assigned_user:{name:'Paul',id: 34158},doc_status: "processed"},{assigned_user:{name:'Simon',id: 48569},doc_status: "processed"},{assigned_user:{name:'Simon',id: 48569},doc_status: "processed"}]; 
 

 
const b = [...new Set(a.map(x => x.assigned_user.name))] 
 
\t .map(x => Object.assign({}, {user: x, count: a.filter(e => e.assigned_user.name === x).length})) 
 
    
 
console.log(JSON.stringify(b, null, 2))

0

Sie könnten eine Hash-Tabelle als Referenz auf die Anzahl der Benutzer verwenden.

Dann iterieren Sie über das angegebene Array und überprüfen Sie, ob die Hash-Tabelle das Benutzerobjekt enthält. Wenn nicht, erstellen Sie ein Objekt und schieben Sie das Objekt auf die Ergebnismenge.

Inkrementieren Sie die Anzahl der Benutzer am Objekt der Hash-Tabelle.

Später könnten Sie das Ergebnis-Array für Top-Anzahl an der Spitze sortieren.

var data = [{ assigned_user: { name: 'Paul', id: 34158 }, doc_status: "processed" }, { assigned_user: { name: 'Simon', id: 48569 }, doc_status: "processed" }, { assigned_user: { name: 'Simon', id: 48569 }, doc_status: "processed" }], 
 
    count = data.reduce(function (hash) { 
 
     return function (r, a) { 
 
      var user = a.assigned_user.name; 
 
      if (!hash[user]) { 
 
       hash[user] = { user: user, count: 0 }; 
 
       r.push(hash[user]); 
 
      } 
 
      hash[user].count++; 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 

 

 
count.sort(function (a, b) { return b.count - a.count; }); 
 
console.log(count);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

können Sie JSON.stringify() verwenden, .match() mit RegExp/("name":)"\w+(?=")/"name" Eigenschaft und einen Wert von Objekt zu erhalten, .replace() mit RegExp/["]|name":/g Eigenschaftsnamen zu entfernen; for..of Schleife und Array.prototype.find() zu überprüfen, ist Eigentum im Objekt vorhanden ist, wenn nicht .push() Objekt Array, sonst Zuwachs "count" Eigenschaft

let data = [{ 
 
    assigned_user: { 
 
     name: 'Paul', 
 
     id: 34158 
 
    }, 
 
    doc_status: "processed" 
 
    }, 
 
    { 
 
    assigned_user: { 
 
     name: 'Simon', 
 
     id: 48569 
 
    }, 
 
    doc_status: "processed" 
 
    }, 
 
    { 
 
    assigned_user: { 
 
     name: 'Simon', 
 
     id: 48569 
 
    }, 
 
    doc_status: "processed" 
 
    } 
 
]; 
 

 
let res = []; 
 
for (let user of JSON.stringify(data).match(/("name":)"\w+(?=")/g).map(user => user.replace(/["]|name":/g, ""))) { 
 
    if (!res.find(({user: _name}) => _name === user)) 
 
    res.push({user, count: 1}) 
 
    else 
 
    ++res.find(({user: _name}) => _name === user).count 
 
} 
 

 
console.log(res);

Verwandte Themen