2017-05-30 3 views
0

Ich arbeite mit einigen Daten von der Seite, um ein Array zu manipulieren und neu zu ordnen. Bisher habe ich meine Anordnung von Objekten neu geordnet, basierend auf einer sortierten "sortierenden Anordnung". Das ursprüngliche Array war:Dynamische Arrays mit es2015 neu anordnen

[ 
    { 
     "domain":"www.exampleurl.com/redirect", 
     "retailerName":"eBay", 
     "providerName":"ebay", 
     "needProcessing":false 
    }, 
    { 
     "domain":"www.exampleurl.com/redirect", 
     "retailerName":"Cheap-Coilovers.co.uk", 
     "providerName":"pricerunner", 
     "needProcessing":false 
    }, 
    { 
     "domain":"www.exampleurl.com/redirect", 
     "retailerName":"House of Fraser", 
     "providerName":"connexity", 
     "needProcessing":false 
    }, 
    { 
     "domain":"www.exampleurl.com/redirect", 
     "retailerName":"notonthehighstreet.com", 
     "providerName":"connexity", 
     "needProcessing":false 
    } 
] 

ich dann diesen Array durch meine Sortierfunktion ausführen:

function compare(a, b) { 
    let sortingArr = ['connexity', 'ecn', 'kelkoo', 'nexttag', 'pricerunner', 'shopping', 'ebay']; 

    if (sortingArr.indexOf(a.providerName) < sortingArr.indexOf(b.providerName)) { 
     return -1; 
    } 
    if (sortingArr.indexOf(a.providerName) > sortingArr.indexOf(b.providerName)) { 
     return 1; 
    } 
    return 0; 
} 
retailersOrdered.sort(compare); 

Diese dann gibt mir meine Array von Objekten in der Reihenfolge der Sortieranordnung, die groß ist, und die gewünschte Wirkung:

[ 
    { 
     "domain":"www.exampleurl.com/redirect", 
     "retailerName":"House of Fraser", 
     "providerName":"connexity", 
     "needProcessing":false 
    }, 
    { 
     "domain":"www.exampleurl.com/redirect", 
     "retailerName":"notonthehighstreet.com", 
     "providerName":"connexity", 
     "needProcessing":false 
    }, 
    { 
     "domain":"www.exampleurl.com/redirect", 
     "retailerName":"Cheap-Coilovers.co.uk", 
     "providerName":"pricerunner", 
     "needProcessing":false 
    }, 
    { 
     "domain":"www.exampleurl.com/redirect", 
     "retailerName":"eBay", 
     "providerName":"ebay", 
     "needProcessing":false 
    } 
] 

ich möchte nun diesen einen Schritt weiter nehmen und die Anordnung in einer Art von „Round-Robin“ -Weise bestellen. Also nimmt es das erste Objekt mit providerName "connexity", dann das erste Objekt mit providerName "pricerunner", dann das erste Objekt mit providerName "ebay" und dann zurück zum Anfang, das zweite Objekt mit providerName "connexity" und so weiter. zu geben, um den gewünschten Ausgang: ist

[ 
    { 
     "domain":"www.exampleurl.com/redirect", 
     "retailerName":"House of Fraser", 
     "providerName":"connexity", 
     "needProcessing":false 
    }, 
    { 
     "domain":"www.exampleurl.com/redirect", 
     "retailerName":"Cheap-Coilovers.co.uk", 
     "providerName":"pricerunner", 
     "needProcessing":false 
    }, 
    { 
     "domain":"www.exampleurl.com/redirect", 
     "retailerName":"eBay", 
     "providerName":"ebay", 
     "needProcessing":false 
    }, 
    { 
     "domain":"www.exampleurl.com/redirect", 
     "retailerName":"notonthehighstreet.com", 
     "providerName":"connexity", 
     "needProcessing":false 
    } 
] 

Dieses Array dynamisch und mit einer variierenden Anzahl von Objekten pro Anbieter aufgebaut. Ich bemühe mich, einen Weg zu finden, dieses Array in der Reihenfolge Provider [1] zu sortieren, dann Anbieter [2] mit dynamischen Namen und Längen. Ich hoffe, es gibt einige neue Funktionen von es2015, die dazu beitragen könnten, dies zu erreichen? Jede Kenntnis der Anordnung solcher Arrays wäre großartig.

+0

Das ist keine * Art *, weil für ein Round-Robin-Layout Sie keine [vergleichbare Bestellung] (https haben: //en.wikipedia. org/wiki/Vergleichbarkeit). – Bergi

+0

Sie können mehrere Arrays erstellen, eines für jeden Providernamen. Durchqueren Sie Ihr Array und füllen Sie neue Arrays (eins für jeden Provider-Namen). Befüllen Sie nun Ihr Original-Array, indem Sie jedes Array nach Provider-Namen in der Reihenfolge ihres Vorrangs durchlaufen –

+0

Tun Sie einfach "tags.map (t => retailers.filter (by (t)))). Transpose(). Flatten()' - but Nein, weder "by" noch "transpose" oder "flatten" sind Teil von ES6. Sie können viele Implementierungen im Web finden, wenn Sie nicht wissen, was sie tun. – Bergi

Antwort

0

Die Idee besteht darin, die Arrays ein Element nach dem anderen zu verknüpfen, bis alle Elemente in der Reihenfolge des Round-Robins hinzugefügt wurden. Dies kann erreicht werden, indem Sie eine geordnete Liste der verwendeten providerNames erstellen, die Elemente nach providerName gruppieren und dann das korrekte Element in ein neues Array verschieben, das zurückgegeben werden soll. Hier ist eine Demo:

var data = [ 
 
    { 
 
     "domain":"www.exampleurl.com/redirect", 
 
     "retailerName":"eBay", 
 
     "providerName":"ebay", 
 
     "needProcessing":false 
 
    }, 
 
    { 
 
     "domain":"www.exampleurl.com/redirect", 
 
     "retailerName":"Cheap-Coilovers.co.uk", 
 
     "providerName":"pricerunner", 
 
     "needProcessing":false 
 
    }, 
 
    { 
 
     "domain":"www.exampleurl.com/redirect", 
 
     "retailerName":"House of Fraser", 
 
     "providerName":"connexity", 
 
     "needProcessing":false 
 
    }, 
 
    { 
 
     "domain":"www.exampleurl.com/redirect", 
 
     "retailerName":"notonthehighstreet.com", 
 
     "providerName":"connexity", 
 
     "needProcessing":false 
 
    } 
 
]; 
 

 
var providerNameIndex = 0; 
 
// group objects by provider name 
 
var groupedByProviderName = data.reduce(function (result, current) { 
 
    if (!result[current.providerName]) { 
 
     result[current.providerName] = []; 
 
    } 
 
    result[current.providerName].push(current); 
 
    return result; 
 
}, {}); 
 

 
// get providerNames in use, sorted in order specified by sortingArr 
 
var providerNames = Object.keys(groupedByProviderName).sort(function (a, b) { 
 
    let sortingArr = ['connexity', 'ecn', 'kelkoo', 'nexttag', 'pricerunner', 'shopping', 'ebay']; 
 
    if (sortingArr.indexOf(a) < sortingArr.indexOf(b)) { 
 
     return -1; 
 
    } 
 
    if (sortingArr.indexOf(a) > sortingArr.indexOf(b)) { 
 
     return 1; 
 
    } 
 
    return 0; 
 
}); 
 

 
function stitch (obj) { 
 
    var results = []; 
 
    // repeat until all items have been placed in new array 
 
    while(providerNames.some(name => obj[name].length)) { 
 
     // cycle through provider names 
 
     var providerName = providerNames[providerNameIndex % providerNames.length]; 
 
     // if array still has items, push first item into new arr 
 
     if(obj[providerName].length) { 
 
      results.push(obj[providerName].shift()); 
 
     } 
 
     // increment index to get next provider name in sequence 
 
     providerNameIndex++; 
 
    } 
 
    
 
    return results; 
 
} 
 

 
console.log(stitch(groupedByProviderName));