2015-10-07 33 views
-1

我有对象的JSON数组,看起来是这样的:的JavaScript数组排序2个性能

var garments [{ 
    name: 'Garment 1', 
    isDesignable: false, 
    priority: 3 
},{ 
    name: 'Garment 2', 
    isDesignable: false, 
    priority: 1 
},{ 
    name: 'Garment 3', 
    isDesignable: true, 
    priority: 3 
},{ 
    name: 'Garment 4', 
    isDesignable: true, 
    priority: 2 
},{ 
    name: 'Garment 5', 
    isDesignable: true, 
    priority: 4 
}]; 

起初,我需要通过优先,所以我这样做是为了对数组进行排序:

garments.sort(function (a, b) { 

    // By priority 
    return a.priority - b.priority; 
}); 

这很好。但现在,我意识到如果服装不是可设计的,那么它应该位于阵列的底部,而不管它是否优先。任何人都可以帮助我使用排序功能,因此所有非设计的服装都处于最底层吗?

回答

1

使用一行代码的解决方案。

首先建立isDesignable之间的差异,如果相同,则应用差异priority作为排序指标。

var garments = [{ 
 
     name: 'Garment 1', 
 
     isDesignable: false, 
 
     priority: 3 
 
    }, { 
 
     name: 'Garment 2', 
 
     isDesignable: false, 
 
     priority: 1 
 
    }, { 
 
     name: 'Garment 3', 
 
     isDesignable: true, 
 
     priority: 3 
 
    }, { 
 
     name: 'Garment 4', 
 
     isDesignable: true, 
 
     priority: 2 
 
    }, { 
 
     name: 'Garment 5', 
 
     isDesignable: true, 
 
     priority: 4 
 
    }]; 
 
// sort isDesignable first and then by priority ascending 
 
garments.sort(function (a, b) { 
 
    return b.isDesignable - a.isDesignable || a.priority - b.priority; 
 
}); 
 
document.write('<pre>' + JSON.stringify(garments, 0, 4) + '</pre>'); 
 

 
// sort reversing the former sort order by sorting, not reversing 
 
garments.sort(function (a, b) { 
 
    return a.isDesignable - b.isDesignable || b.priority - a.priority; 
 
}); 
 
document.write('<pre>' + JSON.stringify(garments, 0, 4) + '</pre>');

4
garments.sort(function (a, b) { 
    if (a.isDesignable == b.isDesignable) { 
     return a.priority - b.priority; 
    } else if (a.isDesignable) { 
     return -1; 
    } else { 
     return 1; 
    } 
}); 
+0

我能问回报1位是什么? – r3plica

+0

这就是比较函数应该做的事情:返回值<0, 0 or > 0表示第一个元素低于,等于或高于第二个元素。 'a'不是可设计的,而是'b'时,'return 1'就是这种情况。 – deceze

+0

我不知道为什么,但是这个函数返回数组前面的非可设计对象,然后优先级从高到低排列。我需要它相反的方式 – r3plica