Javascript 根据特定的键值对数组的对象进行排序

Javascript 根据特定的键值对数组的对象进行排序,javascript,arrays,reactjs,object,Javascript,Arrays,Reactjs,Object,我有一个对象数据数组,我想按照default的特定键对数组中的对象进行排序。在路由数组中。它有一些路线的目标。我只想根据默认值键进行排序。如果对象内部的键default:true,则此对象将转到顶部,如果在多个对象中找到default:true,则始终设置找到default:true键的第一个对象的顶部。此外,如果我们在对象的子对象:[]中找到键default:true,则它是父对象,该对象将位于顶部。因此,请提出解决方案 输入数据: [ { "id": 1,

我有一个对象数据数组,我想按照
default
的特定键对数组中的对象进行排序。在路由数组中。它有一些路线的目标。我只想根据
默认值
键进行排序。如果对象内部的键
default:true
,则此对象将转到顶部,如果在多个对象中找到
default:true
,则始终设置找到
default:true
键的第一个对象的顶部。此外,如果我们在对象的子对象:[]中找到键
default:true
,则它是父对象,该对象将位于顶部。因此,请提出解决方案

输入数据:

[
  {
    "id": 1,
    "title": 'Dashboard',
    "subrr": [
      {
        "id": 2,
        "title": 'Test'
      ]
    },
    {
      "id": 3,
      "title": 'Card',
      "default": true,
      "subrr": [
        {
          "id": 4,
          "title": 'notification'
        }
      ],
    },
    {
      "id": 5,
      "title": 'User',
      "subrr": [
        {
          "id": 6,
          "title": 'sample'
        },
        {
          "id": 7,
          "title": 'chart',
          "default": true
        }
      ]
    },
  ];
/**************/

输出数据:

[
{
      "id": 5,
      "title": 'User',
      "subrr": [
      ,
        {
          "id": 7,
          "title": 'chart',
          "default": true
        },
        {
          "id": 6,
          "title": 'sample'
        }
      ]
    },
    ,
    {
      "id": 3,
      "title": 'Card',
      "default": true,
      "subrr": [
        {
          "id": 4,
          "title": 'notification'
        }
      ],
    },
  {
    "id": 1,
    "title": 'Dashboard',
    "subrr": [
      {
        "id": 2,
        "title": 'Test'
      ]
    }
  ];

我如何解释您的排序要求:

  • 元素排序.subar[i].默认值
    属性
  • 元素排序。默认属性
  • 为要排序的每个条件创建比较器函数

    const byDefault = (a, b) => (a.default === b.default ? 0 : a.default ? -1 : 1);
    
    const bySubArrDefault = (a, b) => {
      const resA = a.subarr.some((el) => el.default);
      const resB = b.subarr.some((el) => el.default);
    
      if (resA === resB) return 0;
      return resA && !resB ? -1 : 1;
    };
    
    现在,要按多个条件进行排序,您将基本上进行排序和分组,对每个组进行排序,然后对每个子组进行排序。分组/排序是通过将所有比较器函数与逻辑OR(
    |
    )组合来实现的。此逻辑尝试查找并返回第一个非零比较器函数结果

    data.sort((a, b) => bySubArrDefault(a, b) || byDefault(a, b))
    
    这将按子数组元素
    default
    properties对所有数据元素进行排序,然后在该组中按根
    default
    属性进行排序

    const数据=[
    {
    id:1,
    标题:“仪表板”,
    斯巴鲁:[
    {
    id:2,
    标题:“测试”
    }
    ]
    },
    {
    id:3,
    标题:“卡片”,
    默认值:true,
    斯巴鲁:[
    {
    id:4,
    标题:“通知”
    }
    ]
    },
    {
    id:5,
    标题:“用户”,
    斯巴鲁:[
    {
    id:6,
    标题:“样本”
    },
    {
    id:7,
    标题:“图表”,
    默认值:true
    }
    ]
    }
    ];
    常量默认值=(a,b)=>(a.default==b.default?0:a.default?-1:1);
    常量bySubArrDefault=(a,b)=>{
    const resA=a.subar.some((el)=>el.default);
    const resB=b.subar.some((el)=>el.default);
    if(resA==resB)返回0;
    返回resA&!resB?-1:1;
    };
    常量排序=数据
    .slice(0)
    .sort((a,b)=>bySubArrDefault(a,b)| | byDefault(a,b));
    
    控制台日志(已排序)为什么要排序?您似乎只对查找第一个将
    default
    设置为
    true
    的对象感兴趣。您已经尝试了什么?你能和我共用一个房间吗?最好还包括一些示例输入数据的预期输出结果示例。我认为您的输出与排序不匹配,其中元素的
    default
    属性为true,或者其
    subar
    属性中的元素的
    default
    属性为true。id为
    id
    2的元素对象似乎应该在id为
    1之前排序,因为它有一个
    default:true
    属性。事实上,根据我对数据排序方式的解释,我将其排序(按`id)[2,3,1]。@drewerese我只想按默认键对数据对象排序,在父对象或子对象中都是如此