根据要显示的所需项目数组对对象数组进行排序

时间:2014-05-01 12:08:09

标签: javascript arrays sorting object

鉴于此数据结构:

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之后。

1 个答案:

答案 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道具进行比较。