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

标签 javascript sorting

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

  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/

相关文章:

javascript - 防止表单在 jQuery Validate 插件的 submitHandler 函数中提交

javascript - 如何匹配其他所有内容,但无论它与正则表达式匹配?

python - Pandas 数据透视表手动对列进行排序

java - 为双向链表的实现编写一个 add 方法,该链表在我向其中添加对象时进行排序

javascript - 通过成对比较对 n 个项目的列表进行排序的算法

javascript - 加载所有内容时加载函数

javascript - 将 JSInterop 的 ExampleJsInterop JavaScript 代码转换为 TypeScript

javascript - Google Shopping API node.js 产品插入返回 "INSERT request must specify product"错误

java - 如何使用 lambda 表达式基于一个变量对对象列表进行排序?

mysql - 按日期时间排序时,大量连接的 MySQL 查询会变慢,而按 ID 排序则不会变慢