Javascript 如何使用Jquery对数组进行排序
我有一个数组,其中包括子数组。孩子们,我已成功对数组进行排序,但无法对其进行排序 使用下面的代码,我可以对外部邮件数组元素进行排序,但不能对其子元素进行排序Javascript 如何使用Jquery对数组进行排序,javascript,html,jquery,Javascript,Html,Jquery,我有一个数组,其中包括子数组。孩子们,我已成功对数组进行排序,但无法对其进行排序 使用下面的代码,我可以对外部邮件数组元素进行排序,但不能对其子元素进行排序 var arry=[{ 'id':301, 'name':'2foo', “打开”:“打开”, “儿童”:[{ 编号:1313, 'name':'2.1 Foo', “打开”:“打开” }, { “id”:1143, 'name':'2.3 Foo', “打开”:“打开” }, { “id”:1132, 'name':'2.2foo',
var arry=[{
'id':301,
'name':'2foo',
“打开”:“打开”,
“儿童”:[{
编号:1313,
'name':'2.1 Foo',
“打开”:“打开”
},
{
“id”:1143,
'name':'2.3 Foo',
“打开”:“打开”
},
{
“id”:1132,
'name':'2.2foo',
“打开”:“打开”
},
],
},
{
id:30,
'name':'1foo',
“打开”:“打开”,
“儿童”:[{
“id”:1134,
'name':'1.1 Foo',
“打开”:“打开”
},
{
“id”:1130,
“名称”:“1.3 Foo”,
“打开”:“打开”
},
{
“id”:1123,
'name':'1.2foo',
“打开”:“打开”
},
],
},
];
函数SortByName(a,b){
var aName=a.name.toLowerCase();
var bName=b.name.toLowerCase();
返回((aNamebName)?1:0));
}
$(文档).ready(函数(){
var sorted_array=arry.sort(SortByName)
console.log(排序的数组)
})
您还需要迭代数组以对所有子项进行排序。赋值是不必要的,因为它会改变数组
array.forEach(({ children }) => children.sort(sortByName));
请修改你的函数如下
函数SortByName(a,b){
如果(a.儿童){
a、 children=a.children.sort(SortByName)
}
如果(b.儿童){
b、 children=b.children.sort(SortByName)
}
var aName=a.name.toLowerCase();
var bName=b.name.toLowerCase();
返回((aNamebName)?1:0));
}
您需要两个函数来对这些对象进行排序,一个用于Desc,另一个用于Asc排序,如下所示:
function sortByKeyDesc(array, key) {
return array.sort(function (a, b) {
var x = a[key]; var y = b[key];
return ((x > y) ? -1 : ((x < y) ? 1 : 0));
});
}
function sortByKeyAsc(array, key) {
return array.sort(function (a, b) {
var x = a[key]; var y = b[key];
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
});
}
function querySucceeded(data) {
posts = [];
posts = sortByKeyDesc(data, "TagName");
}
你从来不会对孩子们调用
.sort
。@VLAZ好的,那是什么solution@c.grey对每个元素的子元素调用.sort(SortByName)
。@MakwanaPrahlad不,这不是递归的最佳解决方案@c、 格雷,我什么都没做。。。刚刚调用了函数本身……。:)不,这是一个最糟糕的解决方案,因为每个父元素都会对子元素进行一次又一次的排序。@c.grey重复排序会大大提高排序的复杂性。见鬼,根据排序算法的实现,您可能会得到最差的复杂性,因为像quicksort这样的算法在已经排序的数据集上的性能最差。即使避免了这种情况,也完全没有必要对子对象进行排序和重新排序。@VLAZ您有什么最佳解决方案吗?您永远不需要从头实现两个排序函数。要按相反顺序排序,只需对正确顺序的结果求反,这样泛型的reverseSort=sortingFn=>(…args)=>-1*sortingFn(…args)
就可以工作了。或者您可以通过翻转参数使其更加具体化reverseSort=fn=>(a,b)=>fn(a,b)
。如果您有一个功能实用程序库,那么您可以使用一个现成的解决方案sortAsc={/*…logic…*/};sortDesc=翻转(sortAsc)代码>这样你就不必重复了。下次请添加信息并解释原因和方式
function querySucceeded(data) {
posts = [];
posts = sortByKeyDesc(data, "TagName");
}