如何以角度自定义排序顺序显示列表?

时间:2017-08-14 16:45:06

标签: javascript angular typescript

我正在尝试使用自定义顺序[m,r,d,v,o]在屏幕上显示对象列表。 我尝试使用 sort()函数,该函数适用于第一个和最后一个项目,但中间是随机的。

我应该在这种情况下使用 sort()功能吗?如果是这样,我做错了什么?

在UI中,我使用* ngFor循环遍历数组。

<div *ngFor="let stuff of sortedStuff; let i = index;">
    <div>want to display in the custom sort order here</div>
    <ul><li> {{ stuff.someproperty }} <li></ul>
</div>

构建数组的代码:

var sortedStuff = stuff.splice(0);
sortedStuff.sort((obj1) => {
    if (obj1.propertyX === 'M') {
        return -1;
    }

    if (obj1.propertyX!= 'M' && obj1.propertyX!= 'D' && obj1.productType != 'V' && obj1.propertyX!= 'O' && obj1.propertyX=== 'R'){
        return 1;
    }

    if (obj1.propertyX!= 'M' && obj1.propertyX!= 'R' && obj1.propertyX!= 'V' && obj1.propertyX!= 'O' && obj1.propertyX === 'D'){
        return 1;
    }

    if (obj1.propertyX!= 'M' && obj1.propertyX!= 'D' && obj1.propertyX!= 'R' && obj1.propertyX!= 'O' && obj1.propertyX === 'V'){
        return 1;
    } 

    if (obj1.obj1.propertyX != 'M' && obj1.obj1.propertyX != 'D' && obj1.obj1.propertyX != 'V' && obj1.obj1.propertyX != 'R' && obj1.obj1.propertyX === 'O'){
        return 1;
    }
    return 0;
});

2 个答案:

答案 0 :(得分:2)

这里的Angular没有错,你错误地使用了内置的Array#sort函数。

传入ino sort的lambda是具有以下属性的“比较函数”(来自链接的MDN):

  

如果提供compareFunction,则根据compare函数的返回值对数组元素进行排序。如果a和b是要比较的两个元素,那么:

     
      
  • 如果compareFunction(a,b)小于0,则将a排序为低于b的索引,即a先出现。
  •   
  • 如果compareFunction(a,b)返回0,则保持a和b相对于彼此保持不变,但是对所有不同的元素进行排序。注意:ECMAscript标准不保证这种行为,因此并非所有浏览器(例如可追溯到至少2003年的Mozilla版本)都尊重这一点。
  •   
  • 如果compareFunction(a,b)大于0,则将b排序为低于a的索引。   当给定一对特定元素a和b作为其两个参数时,compareFunction(a,b)必须始终返回相同的值。如果返回不一致的结果,则排序顺序未定义。
  •   

代码中的功能只能使用一个参数,这意味着无法正确比较数组中的两个项目。

如果这不是您喜欢的方法,我建议您使用sortBy from loash。它接受一个“抓取”对象的一些数据的函数。抓取的数据按标准比较。

答案 1 :(得分:0)

不,你不应该使用 sort()。一个简单的解决方案就是编写一个自定义函数,如:

  csorts(items: string[], order: string[]) {
    let returnItems: string[] = [];
    for (let ord of order) {
      let ordered = [];
      for (let item of items) {
        if (item === ord) {
          ordered.push(item);
        }
      }
      returnItems = returnItems.concat(ordered);
    }
    return returnItems;
  }

导致使用:

let items = ['m','r','d','m','v','r','m','d','d','r']
let order = ['m','r','d','v','o']
let ordered = csort(items, order);
console.log(ordered);

...

[ 'm', 'm', 'm', 'r', 'r', 'r', 'd', 'd', 'd', 'v' ]