Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Jquery对数组进行排序_Javascript_Html_Jquery - Fatal编程技术网

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");
  }