如何通过两个键和一个条件对数组进行排序

时间:2017-01-21 17:34:11

标签: javascript sorting prestashop

首先,我很抱歉这个令人困惑的标题,我真的没有找到任何好的标题。

所以,我正在尝试在prestashop中导入一些类别

我的阵列

id          parent
556         2
563         2
568         2
511         510
555         510
.
.
.
510         568

我正在尝试按此顺序导入。 Prestashop给出错误,因为类别id 511的父类别(510)尚不存在。

我不知道如何对这个数组进行排序,所以这不会发生。

1 个答案:

答案 0 :(得分:1)

您可以使用树并首先使用顶级项目构建结果。

树构建在一个循环中,其中包含未分类的项目和一个用于收集项目的临时对象o。然后检查在p中收集的所有父节点,如果没有数据可用,则找到根节点并将其添加到结果r中,稍后将其作为树返回。

对于最终的排序顺序,迭代树,并将可用的data推送到已排序的数组。如果找到children属性和一个数组,子项将使用iter的递归调用进行迭代,以便按正确的顺序获取项目,这意味着父项将被推送。



var data = [{ id: 556, parent: 2 }, { id: 563, parent: 2 }, { id: 568, parent: 2 }, { id: 511, parent: 510 }, { id: 555, parent: 510 }, { id: 510, parent: 568 }],
    sorted = [],
    tree = function (data) {
        var o = {}, p = {}, r = [];
        data.forEach(function (a) {
            var temp = { data: a };
            p[a.parent] = true;
            temp.children = o[a.id] && o[a.id].children;
            o[a.id] = temp;
            o[a.parent] = o[a.parent] || {};
            o[a.parent].children = o[a.parent].children || [];
            o[a.parent].children.push(temp);
        });
        Object.keys(p).forEach(function (k) {
            if (!o[k].data) {
                r.push(o[k]);
            }
        });
        return r;
    }(data);

tree.forEach(function iter(n) {
    if (n.data) {
        sorted.push(n.data);
    }
    if (Array.isArray(n.children)) {
        n.children.forEach(iter);
    }
});

console.log(sorted);

.as-console-wrapper { max-height: 100% !important; top: 0; }




相关问题