2017-05-23 13 views
1

Ich habe ein Array Ich möchte gegen ein bestimmtes Schlüsselwertpaar suchen.Durch Array gehen und doppelte Objekte in ein separates Array verschieben

var myObj = [ 
    {"name" : "Kanye", "song" : "Jesus Walks"}, 
    {"name" : "Axel Ross", "song" : "Thunder Struck"}, 
    {"name" : "Kate Perry", "song" : "Superbass"}, 
    {"name" : "Kanye", "song" : "Fade"}, 
    {"name" : "Kanye", "song" : "Old Kanye"}, 
]; 

Was ich bekommen möchte, ist zwei Arrays, die so aussehen.

var cleanObj = [ 
    {"name" : "Kanye", "song" : "Jesus Walks"}, 
    {"name" : "Axel Ross", "song" : "Thunder Struck"}, 
    {"name" : "Kate Perry", "song" : "Superbass"}, 
]; 

var duplicateObj = [ 
    {"name" : "Kanye", "song" : "Jesus Walks"}, 
    {"name" : "Kanye", "song" : "Fade"}, 
    {"name" : "Kanye", "song" : "Old Kanye"}, 
]; 

Momentan habe ich etwas, das so aussieht.

var duplicateObj = []; 
var cleanObj = {}; 

$.map(myObj, function (obj) { 
    var checkDuplicate = myObj.some(function (elem) { 
     return elem.name == obj.name; 
    }); 
    if (checkDuplicate) { 
     var tempObj = { 
      name: obj.name, 
      song: obj.song 
     } 
     duplicateObj.push(tempObj); 
    } else { 
     var tempObj = { 
      name: obj.name, 
      song: obj.song 
     } 
     cleanObj.push(tempObj); 
    } 
}); 

Das Problem dabei ist, dass es die erste Instanz des doppelten Objekts nicht verschieben wird. Nur die, nach denen es sich vergleicht.

Irgendeine Idee, wie ich die erste Instanz eines duplizierten Artikels auch verschieben kann?

Vielen Dank im Voraus.

+1

tun teilen Duplikate den gleichen Namen? –

+0

@NinaScholz ja sie teilen den gleichen Namen, nur Name nicht Lied – BaconJuice

+0

Aber in Ihren gewünschten Ergebnis-Arrays, 'Kanye' Eintrag ist auch dort in der cleanObj, aber Sie sagen, Sie wollen nicht das erste Vorkommen von doppelten Elementen enthalten. –

Antwort

1

Sie könnten die Namen einer Hash-Tabelle und Filter und Gruppen verwenden, dann Duplikate machen.

var data = [{ name: "Kanye", song: "Jesus Walks" }, { name: "Axel Ross", song: "Thunder Struck" }, { name: "Kate Perry", song: "Superbass" }, { name: "Kanye", song: "Fade" }, { name: "Kanye", song: "Old Kanye" }], 
 
    groups = Object.create(null), 
 
    singles = data.filter(function (o) { 
 
     if (!groups[o.name]) { 
 
      groups[o.name] = [o]; 
 
      return true; 
 
     } 
 
     groups[o.name].push(o); 
 
    }), 
 
    duplicates = Object.keys(groups).reduce(function (r, k) { 
 
     return r.concat(groups[k].length > 1 ? groups[k] : []); 
 
    }, []); 
 

 
console.log(singles); 
 
console.log(duplicates);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

Ich würde Reduzieren verwenden, um über das Array zu iterieren und ein Objekt zu erstellen, das doppeltes Array und sauberes Array enthält.

mit Array.some Ich kann sagen, ob das saubere Array bereits diesen Künstler haben und schieben Sie ihn auf das doppelte Array, sonst - schieben Sie es auf das saubere Array.

wenn dies das erste Mal, dass ich diesen Künstler die doppelte Array bin Einfügen, ich werde es auch einfügen ist Element, das in der sauberen Array

var myObj = [ 
 
    {"name" : "Kanye", "song" : "Jesus Walks"}, 
 
    {"name" : "Axel Ross", "song" : "Thunder Struck"}, 
 
    {"name" : "Kate Perry", "song" : "Superbass"}, 
 
    {"name" : "Kanye", "song" : "Fade"}, 
 
    {"name" : "Kanye", "song" : "Old Kanye"}, 
 
]; 
 

 
var ans = myObj.reduce((prev,curr)=>{ 
 
    if (!prev.clean.some(item => item.name == curr.name)) { 
 
    prev.clean.push(curr); 
 
    } 
 
    else { 
 
    if (!prev.duplicate.some(item => item.name == curr.name)) { 
 
     prev.duplicate.push(prev.clean.find(item => item.name == curr.name)); 
 
    } 
 
    prev.duplicate.push(curr); 
 
    } 
 
    return prev; 
 
},{duplicate:[], clean:[]}) 
 

 
let duplicate = ans.duplicate; 
 
let clean = ans.clean; 
 

 
console.log(duplicate); 
 
console.log(clean);

0

Sie die Eigenschaft nutzen können "Filter" von Array-Prototyp, hoffe, das hilft:

var myObj = [ 
 
    {"name" : "Kanye", "song" : "Jesus Walks"}, 
 
    {"name" : "Axel Ross", "song" : "Thunder Struck"}, 
 
    {"name" : "Kate Perry", "song" : "Superbass"}, 
 
    {"name" : "Kanye", "song" : "Fade"}, 
 
    {"name" : "Kanye", "song" : "Old Kanye"}, 
 
]; 
 
var singles = []; 
 
var duplicates = []; 
 

 
function exists(valor, onlySingles) { 
 
    var cont = 0; 
 
    for (item in myObj) { 
 
    if (valor.name === myObj[item].name){ 
 
     cont++; 
 
    } 
 
    } 
 
    if (cont > 1) 
 
    return onlySingles ? false : true; 
 
    else 
 
    return onlySingles ? true : false; 
 
} 
 

 
singles = myObj.filter(exists, true); 
 
duplicates = myObj.filter(exists, false); 
 

 

 
console.log("singles:=>"); 
 
console.log(singles); 
 
console.log("duplicates:=>"); 
 
console.log(duplicates);

1

var myObj = [ 
 
    {"name" : "Kanye", "song" : "Jesus Walks"}, 
 
    {"name" : "Axel Ross", "song" : "Thunder Struck"}, 
 
    {"name" : "Kate Perry", "song" : "Superbass"}, 
 
    {"name" : "Kanye", "song" : "Fade"}, 
 
    {"name" : "Kanye", "song" : "Old Kanye"}, 
 
]; 
 
var non_duplicate = []; 
 
var duplicate = []; 
 
var name_array = []; 
 
var dup_names = []; 
 

 
$.each(myObj, function(idx, obj) { 
 
    if ($.inArray(obj.name, name_array) == -1){   
 
    name_array.push(obj.name); 
 
    non_duplicate.push(obj); 
 
    } 
 
    else{ 
 
    dup_names.push(obj.name); 
 
    } 
 
}); 
 

 
dups = $.unique(dup_names); 
 

 
$.each(dups, function(idx1, obj1) { 
 
    $.each(myObj, function(idx2, obj2) { 
 
    if (obj2.name == obj1){   
 
     duplicate.push(obj2); 
 
    } 
 
    }); 
 
}); 
 

 
console.log(non_duplicate); 
 
console.log(duplicate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

+0

Sie vermissen eine in Duplikaten, die erste, –

+0

Dies erzeugt nicht die Ausgabe, die vom OP erwartet wird. –

0

würde ich die Anzahl, wie oft verwenden eine name, als Kriterium zur Entmischung erscheint.

var myObj = [{ 
 
    "name": "Kanye", 
 
    "song": "Jesus Walks" 
 
    }, 
 
    { 
 
    "name": "Axel Ross", 
 
    "song": "Thunder Struck" 
 
    }, 
 
    { 
 
    "name": "Kate Perry", 
 
    "song": "Superbass" 
 
    }, 
 
    { 
 
    "name": "Kanye", 
 
    "song": "Fade" 
 
    }, 
 
    { 
 
    "name": "Kanye", 
 
    "song": "Old Kanye" 
 
    }, 
 
]; 
 

 
var cleanObj = [], 
 
    duplicateObj = []; 
 
var mNameCount = {}; 
 

 
myObj.forEach(function(obj) { 
 
    if (!mNameCount[obj.name]) { 
 
    mNameCount[obj.name] = 0; 
 
    cleanObj.push(obj); 
 
    } 
 
    mNameCount[obj.name]++; 
 
}); 
 

 
myObj.forEach(function(obj) { 
 
    if (mNameCount[obj.name] > 1) { 
 
    duplicateObj.push(obj); 
 
    } 
 
}); 
 
console.log(cleanObj); 
 
console.log(duplicateObj);

Verwandte Themen