2016-08-09 4 views
0

Nehmen wir an, wir diesen Datensatz haben:Javascript, entfernen Eigenschaft aus einer von zwei ähnlichen Objekten in Array

var array = [ 
       { 

         "name": "a", 
         "group": "a" 
       }, 
       { 
         "name": "a", 
         "group": "a" 
       },{ 
         "name": "b", 
         "group": "b" 
       }, 
       { 
         "name": "b", 
         "group": "b" 
       }, 
       { 
         "name": "c" 
       } 
      ]; 

und ich möchte durch das Array in einer Schleife, um zu sehen, wenn es zwei Objekte haben die gleiche Gruppenwert , dann entferne die zweite von ihnen.

for(var i = 0 ; i<array.length;i++){ 
       var a = array[i]; 
       for(var j = 0; j< array.length;j++){ 
        if(array[j].group == a.group){ 
         var b = array[j]; 
         // I need code here to remove property "group" from the variable b only 
         break; 
        } 
       } 
      } 

die endgültigen Ergebnisse Ich möchte sind:

var array2 = [ 
       { 
        "name": "a", 
        "group": "a" 
       }, 
       { 
        "name": "a" 
       },{ 
        "name": "b", 
        "group": "b" 
       }, 
       { 
        "name": "b" 
       },{ 
        "name":"c" 
       }      
      ]; 

HINWEIS: Ich habe versucht, delete array[j].group aber es verursacht sowohl group Eigenschaft von beiden gleich Objekte zu entfernen. Wie kann ich das lösen?

+0

'Ich habe versucht, löschen array [j] .group aber es verursacht beide Gruppeneigenschaft von beiden gleich objects.' zu entfernen, weil irgendwann' a = == b'. Überprüfen Sie, wie Sie eine Schleife erstellen. – Thomas

+0

Ja, ich bemerkte, dass thanx @Thomas –

+0

Und anstatt die Eigenschaft zu löschen, sollten Sie es besser auf 'null' oder' undefined' oder '' '' was auch immer Sie wollen. JS-Engines mögen Objekte mit der gleichen Signatur; * Eigentlich ist es die gleiche versteckte Klasse *, aber das Ändern der Signatur eines Objekts bedeutet auch, dass es seine versteckte Klasse ändert. – Thomas

Antwort

2

Sie nicht denselben Artikel vergleichen sollte, nur Indizes in der inneren Schleife verschieben:

var array = [{"name": "a", "group": "a"}, 
 
      {"name": "a", "group": "a"}, 
 
      {"name": "b", "group": "b"}, 
 
      {"name": "b", "group": "b"}, 
 
      {"name": "c"}]; 
 

 

 
for(var i = 0 ; i < array.length - 1; i++){ 
 
    var a = array[i]; 
 
    if(!a.group){ 
 
    continue; 
 
    } 
 

 
    for(var j = i+1; j < array.length; j++){ 
 
    var b = array[j]; 
 
    if(b.group === a.group){ 
 
     delete b.group; 
 
    } 
 
    } 
 
} 
 

 
console.log(array)

+0

Es funktioniert nicht, wenn es mehr als zwei Objekte mit der gleichen 'Gruppe'-Eigenschaft – rpadovani

+1

nur die Pause zu entfernen. –

1

Sie können dies versuchen:

var tmpObj = {}; 
tmpObj.name = array[j].name; 
array.splice(j, 1, tmpObj); 

Es sollte das Element mit dem Index j und fügen Sie neues Objekt mit nur Namen entfernen.

1

Speichern Sie einfach alle Gruppenwerte, die Sie bereits gesehen haben, und entfernen Sie sie, wenn Sie sie wieder sehen. Darüber hinaus sparen Sie eine Schleife.

var myArray = [...]; 

var existingGroups = []; 

myArray.forEach(function(item){ 
    if(item.group){ 
     if(existingGroups.indexOf(item.group) === -1) 
      existingGroups.push(item.group); 
    else 
     delete item.group; 
    } 
}); 
0

Hier ist ein einfacher Code, die helfen könnten:

var groups = {}; 
array.forEach(function(o) { 
    if (groups[o.group]) { 
    delete o.group; 
    } else { 
    groups[o.group] = true; 
    } 
}) 

Sie können auch einen funktionelleren Ansatz verwenden, aber Sie benötigen eine Ergänzung entweder eine Hilfsprogrammbibliothek oder müssen einige der Methoden selbst implementieren.

var groups = array.map(function(o) { return o.group; }).unique(); 

groups 
    .map(function(group) { 
    return array.filter(function(o) { o.group == group }).slice(1); 
    }) 
    .flatten() 
    .forEach(function(o) { delete o.group }); 

abflachen & einzigartig sind nicht in der JavaScript-Spezifikation enthalten.

1

ich mit einem anderen Ansatz gehen würde:

Kleine Erklärung der if Bedingung:

array.slice(0, i): Nehmen wir nur die bisherigen Elemente des Arrays.

.filter(v => v.group === val.group) wir sehen, ob sie den gleichen Wert für die Eigenschaft haben Gruppe.

.length === 0) Wenn es wenigstens ein Element mit dem gleichen Wert der Gruppe ist, wir geben nicht die, ob und geben nur den Namen, andernfalls werden wir den Wert selbst

var array = [{"name": "a", "group": "a"}, 
 
      {"name": "a", "group": "a"}, 
 
      {"name": "b", "group": "b"}, 
 
      {"name": "b", "group": "b"}, 
 
      {"name": "c"}]; 
 

 
array = array.map((val, i) => { 
 
    if (array.slice(0, i).filter(v => v.group === val.group).length === 0) { 
 
    return val; 
 
    } 
 
    return {name: val.name}; 
 
}) 
 

 
console.log(array)

+0

gleichen Hinweis, wenn es viele andere Eigenschaften als nur Name .. Es wäre etwas schwierig? Ich meine so? @ rpadovani –

0

zurückkehren Sie brauchen dazu keine Schuppenschleifen. Sie können .forEach() verwenden, während Sie die Gruppen überwachen, die bisher gefunden wurden. Dies kann durch Verwendung des optionalen Parameters thisArg oder einer expliziten Variablen erfolgen.

Zum Beispiel:

var array = [ 
 
    { "name": "a", "group": "a" }, 
 
    { "name": "a", "group": "a" }, 
 
    { "name": "b", "group": "b" }, 
 
    { "name": "b", "group": "b" }, 
 
    { "name": "c" } 
 
]; 
 

 
var grp = {}; 
 

 
array.forEach(function(o) { 
 
    grp[o.group] ? delete o.group : grp[o.group] = true; 
 
}); 
 

 
console.log(array);

+0

Aber wenn es viele andere Eigenschaften als nur 'name' gibt .. Es wäre etwas schwierig? Ich meine so? –

+0

@HalaElBarchah Sie sind richtig. Bitte sehen Sie meine aktualisierte Antwort. – Arnauld

Verwandte Themen