gpt4 book ai didi

javascript排序函数两个字段(条件)

转载 作者:行者123 更新时间:2023-12-01 00:40:25 34 4
gpt4 key购买 nike

我正在尝试按以下顺序对对象数组进行排序:

  1. 按先订购
  2. 如果 GROUP > 0,则匹配组优先于 ORDER

示例:

var obj = [
{order:1, title:"Receipts", group:0},
{order:2, title:"Apples", group:1},
{order:7, title:"Costs", group:0},
{order:4, title:"Surplus", group:0},
{order:5, title:"Bananas", group:1},
{order:6, title:"Celery", group:2},
{order:8, title:"Documents", group:0},
{order:3, title:"Potatoes", group:2}
];


var newObj = obj.sort(function(a,b) {
return (a.order - b.order || b.group - a.group);
});

console.log(newObj);

//OUTPUT SHOULD LOOK LIKE THE FOLLOWING
/*

var newObj = [
{order:1, title:"Receipts", group:0},
{order:2, title:"Apples", group:1},
{order:5, title:"Bananas", group:1},
{order:3, title:"Potatoes", group:2}
{order:6, title:"Celery", group:2},
{order:4, title:"Surplus", group:0},
{order:7, title:"Costs", group:0},
{order:8, title:"Documents", group:0},
];

//ORDER OF LOGIC
1. Function sorts by order. Sees that the first entry has GROUP = 0, continues.
2. Function sees second entry has GROUP = 1. Function finds all objects with GROUP = 1
3. After all GROUP=1 objects have been found, function continues by ORDER (next ORDER:3 is at the bottom). Function sees GROUP = 2.
4. Function finds all objects with GROUP=2.
5. After all GROUP=2 objects have been found, function continues by ORDER. The remaining objects have GROUP=0 so no changes made.

*/

我尝试通过使用 map 以简单的方式做到这一点...但我不知道如何做到这一点。我是否应该循环遍历对象,当找到一条记录时,将其拉出并重新循环返回数组以查找类似的对象?

最佳答案

Array#sort 基于重复比较数组中的两个元素。如果两个元素都有非零组,则很容易:首先比较组,然后(如果它们具有相同的组)比较顺序。同样,如果两个元素都在组 0 中,则只需比较顺序即可。

棘手的地方是,如果一个元素具有一组 0 而另一个元素具有非零组。在这种情况下,您无法直接比较它们:要确定结果数组中哪个元素应该排在第一位,您必须查看非零组中所有元素中的最低顺序。此信息无法直接获得。

我们可以通过预先遍历数组并将每个非零组的最低顺序存储在关联数组中(下面代码中的 minOf)来使其可用。

比较函数首先检查两个元素是否都具有非零组(或者都具有 0 组)。无论哪种情况,我们都可以进行正常的双字段比较(首先是group,然后是order)。

否则,我们需要将第 0 组中元素的 order 字段与非零组的 minOf 值进行比较。

... || -1... || 1 回退在两个元素具有相同顺序但一个元素具有组 0 而另一个元素没有的情况下提供一致的排序。

function sortGrouped(arr) {
let minOf = [];
for (const x of arr) {
if (x.group !== 0 && (minOf[x.group] === undefined || x.order < minOf[x.group])) {
minOf[x.group] = x.order;
}
}
return arr.sort((a, b) => {
if ((a.group === 0) === (b.group === 0)) {
return a.group - b.group || a.order - b.order;
}
return (
a.group === 0
? a.order - minOf[b.group] || -1
: minOf[a.group] - b.order || 1
);
});
}

const obj = [
{order:1, title:"Receipts", group:0},
{order:2, title:"Apples", group:1},
{order:7, title:"Costs", group:0},
{order:4, title:"Surplus", group:0},
{order:5, title:"Bananas", group:1},
{order:6, title:"Celery", group:2},
{order:8, title:"Documents", group:0},
{order:3, title:"Potatoes", group:2}
];


const newObj = sortGrouped(obj);

console.log(newObj);

关于javascript排序函数两个字段(条件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57763243/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com