繁体   English   中英

对象数组的排序在Chrome上以及在Firefox上使用javascript进行的工作中

[英]Array of objects sort works on way on Chrome and the other on Firefox with javascript

我有必要使用另一个列表顺序对对象数组进行排序,但是这里捕获列表上的字符串仅部分满足了对象的特定属性。

attribute to verify if it's in the order as shown in the toSort variable. 因此,我需要检查对象的属性,以验证其是否符合toSort变量中所示的顺序。

基本上,我有这样的事情:

var toSort = ['Engeneering', 'Design', 'Implementation', 'Test', 'Homologation'];

var unsortedList = [
{id: 1, name: 'Rework for Test phase'}, 
{id: 2, name: 'Rework for Homologation phase'},
{id: 3, name: 'Rework for Design phase'},
{id: 4, name: 'Excluding Alteration on Implementation phase'}]

我需要一个函数来排序,如toSort变量所示:

var sortedList = [
{id: 3, name: 'Rework for Design phase'},
{id: 4, name: 'Excluding Alteration on Implementation phase'},
{id: 1, name: 'Rework for Test phase'}, 
{id: 2, name: 'Rework for Homologation phase'}];

我以两种方式做到了。 这适用于Firefox:

function orderByPhase(unsortedList) {
 var sortedlist = [];
 for(var i = 0; i <= toSort.lenght; i++) {
    sortedList = unsortedList.sort(a , b) {
      return a.nome.includes(toSort[i]) && !b.nome.includes(toSort[i]) ? 1 : -1;
    }
 }
return sortedList;
}

但这在Chrome上不起作用。 下面的代码可以在Chrome上运行,但不能在Firefox上运行:

function orderByPhase(unsortedList) {
 var sortedlist = [];
 for(var i = 0; i <= toSort.lenght; i++) {
    sortedList = unsortedList.sort(a , b) {
        var aFirst = a.nome.includes(this.fases[i]) ? 1 : -1;
        var bFirst = 0;
        bFirst = aFirst && !b.nome.includes(this.fases[i]) ? 1 : -1;
        return bFirst;
    }
 }
return sortedList;
}

有人可以帮我在这里找到中间立场吗?

您的代码有几个问题:

  • lenght在两个版本中都拼错了,因此循环根本不会迭代
  • i不应该增加并等于length ,因为那样会导致未定义的this.phases[i]参考
  • 不确定unsortedList.sort(a, b)打算做什么: ab未定义, sort仅接受一个(可选)参数。 如果有一个参数,它应该是一个函数。 也许您打算编写这样的箭头函数: sort((a,b) =>
  • 当没有理由强制执行特定顺序时, sort回调函数应该能够返回0。
  • 即使可以工作,也根本没有效率,因为您在每次迭代中都调用sort ,这将使时间复杂度为O(mnlogn) ,其中mtoSort的长度(我假设是相同的)数组为this.phases ),并且n要排序的数组的大小。

我建议首先映射输入数组,以使用每个值所属的索引来丰富它: toSort数组中的索引。 只有这样,才能调用sort ,并使用一个将比较这些索引的回调。 然后,最后通过map调用再次删除这些索引。

这是一个实现:

 var toSort = ['Engeneering', 'Design', 'Implementation', 'Test', 'Homologation']; var unsortedList = [ {id: 1, name: 'Rework for Test phase'}, {id: 2, name: 'Rework for Homologation phase'}, {id: 3, name: 'Rework for Design phase'}, {id: 4, name: 'Excluding Alteration on Implementation phase'} ]; var sorted = unsortedList.map(o => [o, toSort.findIndex(word => o.name.includes(word))]) .sort(([,a], [,b]) => a - b) .map(([o]) => o); console.log(sorted); 

这具有O(nm + nlogn)的时间复杂度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM