首先,我很抱歉这个令人困惑的标题,我真的没有找到任何好的标题。
所以,我正在尝试在prestashop中导入一些类别
我的阵列
id parent
556 2
563 2
568 2
511 510
555 510
.
.
.
510 568
我正在尝试按此顺序导入。 Prestashop给出错误,因为类别id 511的父类别(510)尚不存在。
我不知道如何对这个数组进行排序,所以这不会发生。
答案 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; }