鉴于此数据结构:
var set = [
{
"name":"alpha",
"require":[]
},
{
"name":"beta",
"require":["echo"]
},
{
"name":"charlie",
"require":[]
},
{
"name":"delta",
"require":["charlie", "beta"]
},
{
"name":"echo",
"require":[]
}
];
项目应根据可能的多个要求进行分类,其中有要求的项目应低于所需属性中的所有项目。上述样本数据的可能输出是:
alpha, charlie, echo, beta, delta
我知道有一个Array.sort方法https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort,但我不理解根据多种要求进行排序的算法。
正如我之前所做的那样:
set.sort(function (a, b) {
return a.name > b.require[0] ? 1 : -1;
});
- 编辑@hindmost answer -
虽然这得到了预期的输出但它没有按预期工作。考虑这组新的样本数据:
var set = [
{
"name":"zzz",
"require":["xxx"]
},
{
"name":"xxx",
"require":["yyy"]
},
{
"name":"fff",
"require":[]
},
{
"name":"yyy",
"require":["fff", "kkk"]
},
{
"name":"kkk",
"require":[]
}
];
结果是:
fff, kkk, xxx, zzz, yyy
预期:
fff, kkk, yyy, xxx, zzz
说明:排序不是基于字母名称顺序或需要数组长度,但如果yyy需要fff和kkk,则yyy必须在数组中稍后,然后是fff和kkk。如果zzz需要xxx而xxx需要yyy,那么xxx必须在xy之后的yyy和zzz之后。
答案 0 :(得分:1)
试试这个:
set.sort(function (a, b) {
return a.require.length == b.require.length ?
(a.name < b.name ? -1 : 1) :
(a.require.length < b.require.length ? -1 : 1);
});
<强>解释强>:
首先,我们按require
道具比较元素并返回-1
(第1&lt;第2)或1
(第1&gt;第2)。其次,如果require
的值相等,我们会以类似的方式与name
道具进行比较。