2016-03-30 15 views
0

ich folgende Array haben:Gesamtzahl der gleichen Objekte in Javascript

route: [ 
    { 
    flyFrom: "CDG", 
    flyTo: "DUB", 
    return: 0, 
    }, 
    { 
    flyFrom: "DUB", 
    flyTo: "SXF", 
    return: 0, 
    }, 
    { 
    flyFrom: "SFX", 
    flyTo: "CDG", 
    return: 1, 
    } 
] 

Ich muss zählen, wie oft es Rückkehr: 0 und wie es oft ist Rückkehr: 1.

das Endergebnis würde wie folgt aussehen:

für die Fälle, in denen Rückkehr: 0 erscheint 2-mal --- 1 Stopp

für die Fälle, in denen Rückkehr: 1 erscheint 1mal --- Non-stop

+1

Haben Sie einen Code zum Anzeigen? –

+0

Versucht dies, funktioniert aber nicht: 'var stops_count = route.length; $ .each (Funktion (route.length) {stops_count [route.length] = (stops_count [route.length] || 0) +1;}); ' –

+1

'return' ist ein reserviertes Wort (auch ein Schlüsselwort) in Javascript und kann daher nicht als Objektschlüssel verwendet werden. –

Antwort

3

Sie können filtern 0 und 1 Werte mit Array.prototype.filter() und prüfen die Länge der Folge (ES6 Syntax):

var route = [ 
    { flyFrom: 'CDG', flyTo: 'DUB', return : 0, }, 
    { flyFrom: 'DUB', flyTo: 'SXF', return : 0, }, 
    { flyFrom: 'SFX', flyTo: 'CDG', return : 1, } 
]; 

var zeros = route.filter(r => r.return === 0).length; 
var ones = route.filter(r => r.return === 1).length; 

ES5 Analogie:

var zeros = route.filter(function(r) { 
    return r.return === 0; 
}).length; 

andere Lösung wäre Array zu reduzieren:

var zeros = route.reduce((a, b) => a + (b.return === 0), 0); 
+0

Vielleicht ES5-Lösung auch zeigen? –

+0

Ist die gleiche Lösung ohne Pfeile und Hinzufügen von 'Funktion' und Rückgabe –

+0

Ich frage mich, wenn die Gemeinschaft Lösungen ohne ES5 Alternativen akzeptieren – madox2

0

Sie können über iterieren und die re zählen wendet ein Objekt mit einer einzelnen Schleife an.

var data = { route: [{ flyFrom: "CDG", flyTo: "DUB", 'return': 0, }, { flyFrom: "DUB", flyTo: "SXF", 'return': 0, }, { flyFrom: "SFX", flyTo: "CDG", 'return': 1 }] }, 
 
    count = {}; 
 

 
data.route.forEach(function (a) { 
 
    count[a.return] = (count[a.return] || 0) + 1; 
 
}); 
 

 
Object.keys(count).forEach(function (k) { 
 
    document.getElementById('id' + k).innerHTML = count[k]; 
 
});
<p>for the cases where return: 0 appears <span id="id0">0</span> times --- 1 Stop</p> 
 
<p>for the cases where return: 1 appears <span id="id1">0</span> time --- Non-stop</p>

0

Schnell ES 5 Lösung:

var zeros = 0, ones = 0; 

route.forEach(function(entry) { 
    if(entry.return == 0) zeros++; 
    else if(entry.return == 1) ones++; 
}); 

alert("Zeros: " + zeros + " | Ones: " + ones); 
0

ein JSON-Objekt erstellen. Wählen Sie dann, welches Kind Sie wollen. Zum Beispiel:

var jsonObject = data { 
route: [ 
{ 
flyFrom: "CDG", 
flyTo: "DUB", 
return: 0, 
}, 
{ 
flyFrom: "DUB", 
flyTo: "SXF", 
return: 0, 
}, 
{ 
flyFrom: "SFX", 
flyTo: "CDG", 
return: 1, 
}] 
} 

var zeroCount = 0; 
var oneCount = 0; 
for(var i = 0; i < jsonObject.route.length; i++){ 
var j = jsonObject.route[i].return; 
if(j == 0) zeroCount++; 
else oneCount++; 
} 
+0

Was ist ein "Json-Objekt"? – RobG

0

Diese Funktion, ein Objekt mit zwei Schlüssel zurück, und outboundinbound, um die erforderlichen Nachrichten enthalten, z.B. "Non-stop", "1 stop", etc .:

function countStops(route) { 
    const legs = route.reduce((result, r) => { 
     const leg = r['return'] ? 'inbound' : 'outbound'; 
     result[leg]++; 
     return result; 
    }, { outbound: 0, inbound: 0 }); 

    const message = parts => { 
     switch (parts) { 
      case 1: 
       return 'non-stop'; 
      case 2: 
       return '1 stop'; 
      default: 
       return `${parts - 1} stops`; 
     } 
    }; 

    return { 
     outbound: message(legs.outbound), 
     inbound: message(legs.inbound) 
    }; 
} 

Siehe fiddle hier.

Verwandte Themen