2016-03-19 8 views
2

Ich habe ein Array wie folgt aus:Merging JavaScript-Arrays

[ 
    32545343: { 
    data: [{id: 1}, {id: 2}] 
    }, 
    547347: { 
    data: [{id: 1}, {id: 4}] 
    }, 
    95757: { 
    data: [{id: 1}, {id: 6}] 
    }, 
] 

Wie kann ich alle Daten-Array in einem einzigen Array verschmelzen ohne Objekte mit der gleichen ID, wie diese zu duplizieren:

[{id: 1}, {id: 2}, {id: 4}, {id: 6}] 
+4

Es ist keine gültige Arraystruktur –

+1

Das ist nicht für mich wie eine gültige Syntax sieht - Sie Schlüssel auf einem Array nicht definieren kann, nur auf ein Objekt. Deine äußersten '' 'und' '' sollten ein '{' und '}' sein. –

+0

Sind Sie sicher, dass Sie ein Array haben? –

Antwort

0

Unter der Annahme, Wenn Sie ein Objekt haben, dann würde diese Lösung mit einem temporären Objekt zum Sammeln desselben Objekts arbeiten.

var data = { 32545343: { data: [{ id: 1 }, { id: 2 }] }, 547347: { data: [{ id: 1 }, { id: 4 }] }, 95757: { data: [{ id: 1 }, { id: 6 }] } }, 
 
    result = function (object) { 
 
     var r = []; 
 
     Object.keys(object).forEach(function (k) { 
 
      object[k].data.forEach(function (a) { 
 
       if (!this[a.id]) { 
 
        this[a.id] = a; 
 
        r.push(a); 
 
       } 
 
      }, this); 
 
     }, {}); 
 
     return r; 
 
    }(data); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

0

Die Frage nicht korrekt ist, kann man nicht-Array wie eine Karte definiert werden: [X: 1, Y: 1], korrekte Definition:

var a = { 
    32545343: { 
    data: [{id: 1}, {id: 2}] 
    }, 
    547347: { 
    data: [{id: 1}, {id: 4}] 
    }, 
    95757: { 
    data: [{id: 1}, {id: 6}] 
    } 
}; 

eine Lösung ist, Verwenden einer Flatmap (eine Implementierung ist hier: https://gist.github.com/samgiles/762ee337dff48623e729)

Array.prototype.flatMap = function(lambda) { 
    return Array.prototype.concat.apply([], this.map(lambda)); 
}; 

dann können Sie konvertieren (vergessen Sie nicht ein kein Array ist es eine Aufgabe ist!)

var b = Object.keys(a).flatMap(function(key) { return a[key].data; }); 

// than you can distinct the list: 

var result = b.filter(function(element, index, arr) { return arr.slice(index+1).filter(function(e) { return e.id === element.id }).length===0; }); 
console.log(result); 
+0

Leider deduiert dies nicht die Objekte (Sie haben 3 Objekte mit 'id' = 1. – Andy

+0

Ich habe eine Lösung zu verschiedenen Elementen durch ID hinzugefügt, mit dem ersten Vorkommen von Element. –

3

Lösung mit Set Struktur

var d = { 32545343: { data: [{ id: 1 }, { id: 2 }] }, 547347: { data: [{ id: 1 }, { id: 4 }] }, 95757: { data: [{ id: 1 }, { id: 6 }] }, }; 
 

 
var set = new Set(); 
 

 
Object.keys(d).forEach(a => 
 
    d[a].data.forEach(b => set.add(JSON.stringify(b)))); 
 

 
document.write(Array.from(set));

0

verwendet, könnte Sie eine funktionelle adoptieren Ansatz, bei dem Sie eindeutige Objekte aus einem flachen Array auswählen, das aus dem Datenarray jedes Objekts erstellt wurde.

function flatten(arr) { 
    return arr.reduce(function (p, c) { 
    return p.concat(c); 
    }, []); 
} 

function pluck(obj, key) { 
    return Object.keys(obj).map(function (el) { 
    return obj[el][key]; 
    }); 
} 

function unique(arr, key) { 
    var ids = []; 
    return arr.filter(function (el) { 
    if (ids.indexOf(el[key]) === -1) { 
     ids.push(el[key]); 
     return true; 
    } 
    }); 
} 

var result = unique(flatten(pluck(obj, 'data')), 'id'); 

DEMO