2016-07-28 9 views
1

Ich habe versucht, den Schlüssel von und Array von Objekten zu löschen, wenn es nicht das Gleiche ist, und ein neues Array mit Objekten zurückgeben.Nein bekomme das richtige Ergebnis

var all = [{banana: 1, rose: 2, mouse: 9, apple: 5}, {banana: 1, rock: 58, car: 19, apple: 5}, {banana: 1, red: 14, clue: 89, apple: 5}]; 

function differentKeys(arr){ 
    var different_keys = []; 
    for (var i = 0; i < arr.length; i++) { 
    var tempObj = {}; 
    for (var key in arr[i]) {  
     if (!arr[i][key] || arr[i][key] != arr[0][key] && i !== 0) { 
     tempObj[key] = arr[i][key]; 
     different_keys.push(tempObj); 
    } 
    } 
    } 
    console.log(different_keys); 
} 

differentKeys(all); 

Ergebnis erwartet werden:

different_keys = [{rose: 2, mouse: 9}, {rock: 58, car: 19}, {red: 14, clue: 89}]; 

Anfahrt:

different_keys = [{rock: 58, car: 19}, {red: 14, clue: 89}]; 
+0

Sollte 'arr.push (tempObj);' eigentlich sein 'different_keys .push (tempObj); '? Momentan fügst du zusätzliche Elemente in das Quell-Array ein, während du darüber iterierst, das könnte sicherlich zu einer Endlos-Schleife führen ... – nnnnnn

+0

@nnnnnn danke das wars. aber ich bekomme nicht: 'different_keys = [{rose: 2, mouse: 9}, {rock: 58, auto: 19}, {rot: 14, clue: 89}];' Ich bekomme: ' different_keys = [{Rock: 58, Auto: 19}, {Rot: 14, Hinweis: 89}]; ' Warum? –

Antwort

0

Ihre if-Anweisung wegen i !== 0 nicht das erste Element verarbeiten, und vergleicht sie nur die anderen Elemente gegen die erste, nicht gegeneinander (aber Sie sehen das nicht, weil es einfach so ist, dass bei der Beispieleingabe das zweite und das dritte Objekt keine gemeinsamen Schlüssel haben nicht auch im ersten Objekt). Und es ist .push() in der tempObj innerhalb der for..in, wenn es nach der for..in tun sollte.

Sie müssen drei Schleifen verschachteln: eine äußerste Schleife zum Iterieren über die Eingabeobjekte wie in Ihrem aktuellen Code, eine mittlere Schleife zum Iterieren über die Eigenschaften des aktuellen Objekts gemäß Ihrem aktuellen Code und dann eine innere Schleife zu Überprüfen Sie alle anderen Objekte, um zu sehen, ob sie diese Eigenschaft haben.

Also vielleicht ein bisschen wie das folgende.

var all = [{banana: 1, rose: 2, mouse: 9, apple: 5}, {banana: 1, rock: 58, car: 19, apple: 5, cheese: 3}, {banana: 1, cheese: 2, red: 14, clue: 89, apple: 5}]; 
 

 
function differentKeys(arr) { 
 
    var result = []; 
 
    for (var i = 0; i < arr.length; i++) { // process all elements 
 
    var tempObj = {}; 
 
    for (var key in arr[i]) { // process keys in current element 
 
     var found = false; 
 
     for (var j = 0; j < arr.length; j++) { // compare against other elements 
 
     if (i !== j && arr[j][key] === arr[i][key]) { 
 
      found = true; 
 
      break; 
 
     } 
 
     } 
 
     if (!found) { 
 
     tempObj[key] = arr[i][key]; 
 
     } 
 
    } 
 
    result.push(tempObj); 
 
    } 
 
    return result; 
 
} 
 
console.log(differentKeys(all));

Hinweis: über die davon ausgeht, dass, wenn zwei Objekte haben Eigenschaften mit dem gleichen Namen, aber unterschiedliche Werte (wie die cheese Eigenschaft I auf den zweiten und dritten Objekte hinzugefügt), die Sie diejenigen enthalten sein sollen in den Ergebnissen. Beachten Sie auch, dass ich es geändert habe, so dass die Funktion die Ergebnisse zurückgibt, anstatt sie zu protokollieren (ich gebe dann die Log-Funktion zurück).

Oder hier entspricht Logik mit einem funktionalen Ansatz implementiert - feststellen, wie viel kürzer ist die Funktion:

var all = [{banana: 1, rose: 2, mouse: 9, apple: 5}, {banana: 1, rock: 58, car: 19, apple: 5, cheese: 3}, {banana: 1, cheese: 2, red: 14, clue: 89, apple: 5}]; 
 

 
function differentKeys(arr) { 
 
    return arr.map(function(v, i) { 
 
    return Object.keys(v).reduce(function(a, c) { 
 
     if (!arr.some(function(o, j) { return i != j && v[c] === o[c]; })) 
 
     a[c] = v[c]; 
 
     return a; 
 
    }, {}); 
 
    }); 
 
} 
 
console.log(differentKeys(all));

Verwandte Themen