【发布时间】:2019-06-18 08:35:58
【问题描述】:
我正在尝试基于键和排序顺序对嵌套数组实现多重排序。
我可以根据键和顺序对数组进行排序
我已经完成了以下对数组进行排序的代码,
return array.sort((a, b) => {
let i = 0, result = 0;
while (i < sortBy.length && result === 0) {
if (typeof a[sortBy[i].prop] == "string") {
result = sortBy[i].direction * (a[sortBy[i].prop].toString() < b[sortBy[i].prop].toString() ? -1 : (a[sortBy[i].prop].toString() > b[sortBy[i].prop].toString() ? 1 : 0));
} else {
result = sortBy[i].direction * (a[sortBy[i].prop] < b[sortBy[i].prop] ? -1 : (a[sortBy[i].prop] > b[sortBy[i].prop] ? 1 : 0));
}
i++;
}
return result;
});
我的输入数据如下,
array = [{ x: [{ d: 4 }, { d: 2 }, { d: 3 }, { d: 1 }], b: 'v' }, { x: [{ d: 8 }, { d: 7 }, { d: 5 }, { d: 6 }], b: 's' }];
sortBy= [{ 'prop': 'b', 'direction': 1 }, { 'prop': 'd', 'direction': 1}];
我希望得到如下输出,
array = [{ x: [{ d: 5 }, { d: 6 }, { d: 7 }, { d: 8 }], b: 's' },{ x: [{ d: 1 }, { d: 2 }, { d: 3 }, { d: 4 }], b: 'v' }];
但我得到以下结果,
array = [{ x: [{ d: 8 }, { d: 7 }, { d: 5 }, { d: 6 }], b: 's' },{ x: [{ d: 4 }, { d: 2 }, { d: 3 }, { d: 1 }], b: 'v' }];
我不知道如何解决这个逻辑问题。谁能帮我解决这个问题。
【问题讨论】:
-
您的“逻辑”问题是您不想对一个数组进行排序,而是以两种不同的方式(通过不同的属性)对三个数组进行排序。
-
是你的数组的结构总是这样。或者是否会发生属性 d 像这样隐藏的输入 = [{x: [{b: [{d: 1}]}]}];
-
是的@Thomas。我需要先根据属性“b”按升序对数组进行排序,然后按升序对数组“x”上的属性“d”进行排序。
-
你从哪里知道,
x是下一个要排序的属性? -
@relief.melone 结构有时会发生变化,例如输入 = [{b:'',x:[]}]。但是不会有隐藏的情况 input = [{x: [{b: [{d: 1}]}]}];
标签: javascript arrays sorting