【问题标题】:Sort array of objects based on array of required items to appear after根据需要出现的项目数组对对象数组进行排序
【发布时间】:2014-05-01 12:08:08
【问题描述】:

给定这个数据结构:

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 答案--

虽然这得到了预期的输出,但它并没有按预期工作。考虑这组新的样本数据:

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必须在yyy之后,zzz必须在xxx之后。

【问题讨论】:

    标签: javascript arrays sorting object


    【解决方案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 (1st 1 (1st > 2nd)。其次,如果require 的值相等,我们会以类似的方式通过name 属性进行比较。

    【讨论】:

    • 解释当然也会有帮助。
    • 已更新问题以添加另一个示例、结果和进一步解释。
    • 其实我误解了你的问题。所以无法通过Array的sort方法解决。在这种情况下,唯一的解决方案是使用递归
    猜你喜欢
    • 2013-11-25
    • 2012-12-01
    • 2020-12-15
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多