我正在尝试使用自定义顺序[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;
});
答案 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' ]