2017-02-25 6 views
1

Also, ich habe so etwas wie dies:all Holen Sie sich die Objekte aus einer Liste

objArray1 = [ { candidate1: "Alex" , votes: 4}, { candidate2: "Paul", votes: 3}]; 

objArray2 = [ { candidate1: "Alex" , votes: 7}, { candidate2: "Ben", votes: 3}, { candidate3: "Melisa", votes:8 }]; 

Ich versuche, Javascript zu verwenden, um einen Array mit allen Kandidaten zu machen und sehen, wie viele Stimmen jeder von ihnen hat. Der Teil zur Berechnung der Stimmen ist einfach, aber ich weiß nicht, wie man alle Kandidaten in ein Array bringt.

Ich sollte ein Array mit bekommen: Alex, Paul, Ben und Melisa.

Vielen Dank!

+2

Sie sollten nicht jedes Element geben "Kandidaten" eine Zahl am Ende. Stattdessen nennen Sie es einfach Kandidat und wenn Sie eine ID benötigen, haben Sie ein ID-Feld. Dann können Sie leicht objArray1.concat (objArray2) .map (function (entry) {return entry.candidate}); – JohnD

Antwort

0
var candidates = []; 
var found = 0; 
for(var i=0;objArray1.length>i;i++){ 
    found = 0; 
    //add votes to candidate array 
    for(var j=0;candidates.length>j;j++){ 
     if(candidates[j].name==objArray1[i][Object.keys(objArray1[i])[0]]){ 
      candidates[j].votes = candidates[j].votes+objArray1[i].votes; 
      found = 1; 
     } 
    } 
    //if condidate not found in votes array, create new 
    if(found==0){ 
     var tmp = {}; 
     tmp.name = objArray1[i].candidate; 
     tmp.votes = objArray1[i].votes; 
     //add to array 
     candidates.push(tmp); 
    } 
} 

console.log(candidates); 
2

Sie können eine Hashtabelle verwenden und nach Namen gruppieren.

var array1 = [ { candidate1: "Alex" , votes: 4}, { candidate2: "Paul", votes: 3}], 
 
    array2 = [ { candidate1: "Alex" , votes: 7}, { candidate2: "Ben", votes: 3}, { candidate3: "Melisa", votes:8 }], 
 
    grouped = [array1, array2].reduce(function (hash) { 
 
     return function (r, a) { 
 
      a.forEach(function (o, i) { 
 
       var name = o['candidate' + (i + 1)]; 
 
       if (!hash[name]) { 
 
        hash[name] = { candidate: name, votes: 0 }; 
 
        r.push(hash[name]); 
 
       } 
 
       hash[name].votes += o.votes; 
 
      }); 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 
    
 
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

ein Objekt erzeugen, die Eigenschaftsnamen als Wert als Name und Auszählung der Stimmen hält.

var objArray1 = [ { candidate1: "Alex" , votes: 4}, { candidate2: "Paul", votes: 3}], objArray2 = [ { candidate1: "Alex" , votes: 7}, { candidate2: "Ben", votes: 3}, { candidate3: "Melisa", votes:8 }]; 
 

 
var res = [] 
 
    // cobine two arrays 
 
    .concat(objArray1, objArray2) 
 
    // iterate over the arrays 
 
    .reduce(function(obj, o) { 
 
    // get the key except the votes 
 
    var key = Object.keys(o).find(function(k) { 
 
     return k != 'votes'; 
 
    }) 
 
    // define property if not already defined 
 
    obj[key] = obj[key] || 0; 
 
    // add the vote count 
 
    obj[key] += o.votes; 
 
    // return object refernece 
 
    return obj; 
 
    // set initial value as empty object 
 
    }, {}); 
 

 
console.log(res); 
 
// get the names array if need 
 
console.log(Object.keys(res));

0

die Liste der Namen zu erhalten, wie Sie

fragte
var rawArrays = objArray1.concat(objArray2), Candidates = [], tmp = [] 
for (var i in rawArrays) { 
    tmp[rawArrays[i][Object.keys(rawArrays[i])[0]]] = 1 
} 
Candidates = Object.keys(tmp) 

Um Array mit den Kandidaten und Stimmen Summe

var rawArrays = objArray1.concat(objArray2), Candidates = [] 

for (var i in rawArrays) { 
    name = rawArrays[i][Object.keys(rawArrays[i])[0]] 
    if (Candidates[name]) Candidates[name] += rawArrays[i].votes 
    else Candidates[name] = rawArrays[i].votes 
} 
0

Short Lösung Array.prototype.concat() mit bekommen, Array.prototype.reduce() und Array.prototype.map() Funktionen:

var objArray1 = [ { candidate1: "Alex" , votes: 4}, { candidate2: "Paul", votes: 3}], 
 
    objArray2 = [ { candidate1: "Alex" , votes: 7}, { candidate2: "Ben", votes: 3}, { candidate3: "Melisa", votes:8 }], 
 
    
 
    grouped = objArray1.concat(objArray2).reduce(function(r, o){ 
 
     var k = Object.keys(o).filter(function(k){ 
 
       return k.indexOf('candidate') === 0; 
 
      })[0]; 
 

 
     (r[o[k]])? r[o[k]].votes += o.votes : r[o[k]] = {candidate: o[k], votes: o.votes}; 
 
     return r; 
 
    }, {}), 
 

 
    result = Object.keys(grouped).map(function(k){ return grouped[k]; }); 
 
    
 
console.log(result);

Verwandte Themen