2017-03-25 5 views
0

Ich habe diese Datensätze unten, und ich möchte Verbindung die Daten in jedem Satz:Javascript für/in Schleife - Join Elemente von zwei verschiedenen Objekten?

var data = {}; 
    var datasets = [ 
     {"_id":"58d6c806d7c80d5d44a35204","particles":{"timestamp":[1490470918708,1490470962915,1490470967186],"Particles":["108","108","109"]}}, 
     {"_id":"58d6caf62552b75f26f56f91","particles":{"timestamp":[1490471670888,1490473309103],"Particles":["109","100"]}} 
    ]; 

    datasets.forEach(function(dataset, index) { 
     for (var key in dataset.particles) { 
      data[key] = dataset.particles[key]; 
     } 
    }); 
    console.log(data); 

Ergebnis:

{ timestamp: [ 1490471670888, 1490473309103 ], 
    Particles: [ '109', '100' ] } 

Sie sind nicht verbunden. Das Ergebnis, das ich bin:

{ timestamp: [ 1490470918708,1490470962915,1490470967186, 1490471670888, 1490473309103 ], 
    Particles: [ '108','108','109', '109', '100' ] } 

Irgendwelche Ideen?

EDIT

Ist concat oder push schneller, wenn es zu einem sehr großen Daten kommt?

+1

Da ich eine Menge gute Antwort sehe, werde ich mir nicht schreiben. Nur ein Kommentar Ich merke, dass viele Leute 'concat' benutzen. Dadurch wird jedes Mal ein neues Array erstellt, anstatt nur neue Elemente in das vorhandene Array einzufügen. Ich empfehle stattdessen "Push". – Luka

+0

@Luka ist schneller als Concat? – laukok

+1

Im Allgemeinen ist 'push' schneller, wenn Sie es mit' Array.prototype.push.apply' aufrufen. Aber seien Sie vorsichtig, da dieser Weg begrenzt ist: Sie können keine große Anzahl von Gegenständen auf diese Weise anhängen. – Luka

Antwort

2

Sie müssen die Arrays konkatanieren, nicht nur den Wert neu zuweisen.

var data = {}; 
 
var datasets = [ 
 
    {"_id":"58d6c806d7c80d5d44a35204","particles":{"timestamp":[1490470918708,1490470962915,1490470967186],"Particles":["108","108","109"]}}, 
 
    {"_id":"58d6caf62552b75f26f56f91","particles":{"timestamp":[1490471670888,1490473309103],"Particles":["109","100"]}} 
 
]; 
 

 
datasets.forEach(function(dataset, index) { 
 
    for (var key in dataset.particles) { 
 

 
    // Check if key already exists. 
 
    if(data[key] === undefined) 
 
     data[key] = []; 
 

 
    // Add current timestamps. 
 
    data[key] = data[key].concat(dataset.particles[key]); 
 
    } 
 
}); 
 
console.log(data);

1

Hoffnung ist das, was erforderlich ist:

var data = {}; 
 
var datasets = [{ 
 
    "_id": "58d6c806d7c80d5d44a35204", 
 
    "particles": { 
 
     "timestamp": [1490470918708, 1490470962915, 1490470967186], 
 
     "Particles": ["108", "108", "109"] 
 
    } 
 
    }, 
 
    { 
 
    "_id": "58d6caf62552b75f26f56f91", 
 
    "particles": { 
 
     "timestamp": [1490471670888, 1490473309103], 
 
     "Particles": ["109", "100"] 
 
    } 
 
    } 
 
]; 
 
var output = { 
 

 
} 
 
datasets.forEach(function(dataset, index) { 
 
    for (var key in dataset.particles) { 
 
    if (typeof output[key] == 'undefined') { 
 
     output[key] = [] 
 
    } 
 
    //console.log(dataset.particles[key]) 
 
    for (var k of dataset.particles[key]) { 
 
     output[key].push(k) 
 
    } 
 

 
    } 
 
}); 
 
console.log(output);

+0

danke für die Antwort! ist concat oder push ** schneller ** wenn es um sehr große Daten geht? – laukok

+1

scheint wie concat ist viel schneller als Push Checkout den Unterschied von hier https://jsperf.com/concat-vs-push-array/1 –

+0

danke für die Antwort und Antwort. – laukok

1

In einem funktionalen Programmierung Stil, Sie reduce und Object.keys verwenden:

var datasets = [ 
 
    {"_id":"58d6c806d7c80d5d44a35204","particles":{"timestamp":[1490470918708,1490470962915,1490470967186],"Particles":["108","108","109"]}}, 
 
    {"_id":"58d6caf62552b75f26f56f91","particles":{"timestamp":[1490471670888,1490473309103],"Particles":["109","100"]}} 
 
]; 
 

 
var data = datasets.reduce ((acc, {particles}) => 
 
    Object.keys(particles).reduce ((acc, key) => 
 
     (acc[key] = (acc[key] || []).concat(particles[key]), acc), acc 
 
), {}); 
 
    
 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Alternative mit push statt concat, falls die Leistung ist ein Problem:

var datasets = [ 
 
    {"_id":"58d6c806d7c80d5d44a35204","particles":{"timestamp":[1490470918708,1490470962915,1490470967186],"Particles":["108","108","109"]}}, 
 
    {"_id":"58d6caf62552b75f26f56f91","particles":{"timestamp":[1490471670888,1490473309103],"Particles":["109","100"]}} 
 
]; 
 

 
var data = datasets.reduce ((acc, {particles}) => 
 
    Object.keys(particles).reduce ((acc, key) => 
 
     ((acc[key] = (acc[key] || [])).push(...particles[key]), acc), acc 
 
), {}); 
 
    
 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

aber bewusst sein, dass in dieser Version des Codes , push wird jeder einzelne arra bekommen y Element in particles[key] als ein Argument, das den Stack-Platz belegt, der wiederum begrenzt ist. Siehe "Is there a max number of arguments JavaScript functions can accept?". Sie können diese Einschränkung umgehen, indem Sie für jedes einzelne Element in particles[key] separate Aufrufe push durchführen, aber das wird die Leistung beeinträchtigen. Am Ende könnten Sie besser mit der concat Version sein.

+0

danke. ist das schneller als for-Schleife für die Verkettung sehr großer Datenmengen? – laukok

+1

Warum testen Sie es nicht an Ihren Daten? Im Allgemeinen sind 'for'-Schleifen schnell, aber wenn Sie innerhalb dieser Schleifen viel Manipulation vornehmen, können Array-Methoden manchmal zu Code mit weniger Zuweisungen führen, die dann von der Engine besser optimiert werden können. Alles hängt von Ihrem tatsächlichen Fall und Ihren Daten ab. Testen Sie es einfach. – trincot

+1

Ich habe eine Variante mit 'push' anstelle von' concat' hinzugefügt, aber es ist wirklich zu testen, ob es einen Leistungsunterschied für Ihren Fall gibt. – trincot

Verwandte Themen