2017-05-30 85 views
0

Im使用页面中的一些数据来操作和重新排序数组。到目前为止,我已经基于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); 

这就给了我,我的对象数组中的排序阵列,这是伟大的秩序,期望的效果:

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

我现在想进一步以一种“循环”方式对数组进行排序。因此,第一个对象的providerName为“connexity”,第一个对象的providerName为“pricerunner”,第一个对象的providerName为“ebay”,然后回到开头,第二个对象的providerName为“connexity”等等。给出所需的输出:

[ 
    { 
     "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。组织/维基/可比性)。 – Bergi

+0

你可以做的是创建多个数组,每个提供者名称一个。遍历数组并填充新数组(每个提供者名称一个)。现在通过遍历每个数组的提供者名称来按照它们的优先顺序填充原始数组 –

+0

只需执行'tags.map(t => retailers.filter(by(t)))。transpose()。flatten()' - 但不,'by','transpose'和'flatten'都不是ES6的一部分。但是,如果你不知道他们在做什么,你可以在网上找到很多实现。 – Bergi

回答

0

这个想法是一次一个元素地将数组拼接在一起,直到所有元素都按循环顺序添加为止。这可以通过创建正在使用的providerNames的有序列表来实现,按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));