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我只想按默认键对数据对象排序,在父对象或子对象中都是如此