假设我们有一个对象数组,其中每个对象代表一个类别或子类别,就像这样:
这个数组代表了两个类别的示例,每个类别还有两个子类别。
现在,我遇到了按某种自定义方式对此数组进行排序的问题。正如您所注意到的,每个对象内部的“order”属性与其在层次结构中的位置(或排序)有关。而类别和子类别之间的关系由“parentCategoryId”属性定义。
我需要的预期排序使用上述数据数组作为示例应该是这样的:
我的当前解决该问题的方法是创建一个将属性映射为数字的映射表,并根据以下条件分析属性值:
var data = [
{type: "parent-category", order: 1, categoryId: 1},
{type: "parent-category", order: 2, categoryId: 2},
{type: "child-category", order: 1, categoryId: 3, parentCategoryId: 1},
{type: "child-category", order: 2, categoryId: 4, parentCategoryId: 1},
{type: "child-category", order: 2, categoryId: 5, parentCategoryId: 2},
{type: "child-category", order: 1, categoryId: 6, parentCategoryId: 2}
];
这个数组代表了两个类别的示例,每个类别还有两个子类别。
现在,我遇到了按某种自定义方式对此数组进行排序的问题。正如您所注意到的,每个对象内部的“order”属性与其在层次结构中的位置(或排序)有关。而类别和子类别之间的关系由“parentCategoryId”属性定义。
我需要的预期排序使用上述数据数组作为示例应该是这样的:
var data = [
{type: "parent-category", order: 1, categoryId: 1},
{type: "child-category", order: 1, categoryId: 3, parentCategoryId: 1},
{type: "child-category", order: 2, categoryId: 4, parentCategoryId: 1},
{type: "parent-category", order: 2, categoryId: 2},
{type: "child-category", order: 1, categoryId: 6, parentCategoryId: 2},
{type: "child-category", order: 2, categoryId: 5, parentCategoryId: 2}
];
我的当前解决该问题的方法是创建一个将属性映射为数字的映射表,并根据以下条件分析属性值:
- 对于类型为parent-category的对象,我们赋值为
categoryId * 1000
。 - 对于类为child-category的对象,我们赋值为
(parentCategoryId * 1000) + order
let data = [
{type: "parent-category", order: 1, categoryId: 1},
{type: "parent-category", order: 2, categoryId: 2},
{type: "child-category", order: 1, categoryId: 3, parentCategoryId: 1},
{type: "child-category", order: 2, categoryId: 4, parentCategoryId: 1},
{type: "child-category", order: 2, categoryId: 5, parentCategoryId: 2},
{type: "child-category", order: 1, categoryId: 6, parentCategoryId: 2}
];
let orderedData = data.sort((a, b) =>
{
var aCat = (a.type == "parent-category") ? a.categoryId : a.parentCategoryId;
var aOrder = (a.type == "parent-category") ? 0 : a.order;
var bCat = (b.type == "parent-category") ? b.categoryId : b.parentCategoryId;
var bOrder = (b.type == "parent-category") ? 0 : b.order;
return (aCat * 1000 + aOrder) - (bCat * 1000 + bOrder);
});
console.log(orderedData);
然而,忽略之前的实现可以正常工作这一事实,我的问题是是否存在更好的方法或替代方案来解决这个问题。我不喜欢依赖于将分类映射为数字的想法,因为例如之前的实现在每个类别下正确排序的子类别数量上引入了限制(999
在这种情况下)。谢谢!
reduce()
移动到map()
的位置,简化了代码,希望你不介意。 - Shidersz