2017-05-30 4 views
0

ページからのデータを操作して、配列を操作して順序を変更しています。これまで、私はserperateな配列のソートに基づいてオブジェクトの配列を並べ替えました。私はその後、私のソート関数を使用して、この配列を実行es2015でダイナミックアレイを並べ替える

[ 
    { 
     "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 
    } 
] 

:元の配列は、このでした

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); 

これは、その後、私に素晴らしいですが、ソート配列の順序でオブジェクトの私の配列を与え、希望の効果:

私はこれをさらに進めて、一種の「ラウンドロビン」方式で配列を注文したいと思います。したがって、providerNameが "connexity"の最初のオブジェクト、次にproviderNameが "pricerunner"の最初のオブジェクト、次にproviderNameが "ebay"の最初のオブジェクト、次に先頭に戻り、providerNameが "connexity"などの2番目のオブジェクトなどがあります。

[ 
    { 
     "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 
    } 
] 

このアレイは、プロバイダーごとにさまざまな数のオブジェクトで構成されています。私はこの配列をプロバイダの順に並べ替える方法を思いつきません。[1]、次に動的名と長さを持つプロバイダ[2]。私はこれを達成するのに役立つes2015の新機能がいくつかあると思っていますか?このような方法で配列を配列する知識があれば大丈夫です。

+0

ラウンドロビンレイアウトのためにあなたが[同等の順序](httpsを持っていないので、*ソート*ではありません://en.wikipediaをここにデモがあります。 org/wiki/Comparability)を参照してください。 – Bergi

+0

できることは、プロバイダ名ごとに1つずつ、複数の配列を作成することです。配列をたどり、新しい配列(各プロバイダ名に1つずつ)を設定します。各配列のプロバイダ名を優先順にトラバースして、元の配列に値を設定します。 –

+0

'tags.map(t => retailers.filter(by))))transpose()。flatten()' - いいえ、 'by'も' transpose'も 'flatten'もES6の一部ではありません。あなたが何をしているのか分からなければ、Web上で多くの実装を見つけることができます。 – Bergi

答えて

0

アイデアは、すべての要素がラウンドロビン順に追加されるまで、一度に1つの要素をまとめてステッチすることです。これは、使用中のproviderNamesの順序付きリストを作成し、itemをproviderNameでグループ化し、正しい要素を新しい配列にプッシュして戻すことで実現できます。

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));

関連する問題