【问题标题】:How to sort array using Jquery如何使用 Jquery 对数组进行排序
【发布时间】:2020-08-22 10:09:45
【问题描述】:

我有一个数组,其中包括孩子。我已成功对数组进行排序,但无法排序,孩子们。

使用下面的代码,我可以对外部邮件数组元素进行排序,但不能对其子元素进行排序。

https://jsfiddle.net/eokd5uzj/

var arry = [{
    'id': 301,
    'name': '2 Foo',
    'open': 'open',
    'children': [{
        'id': 1313,
        'name': '2.1 Foo ',
        'open': 'open'
      },
      {
        'id': 1143,
        'name': '2.3 Foo ',
        'open': 'open'
      },
      {
        'id': 1132,
        'name': '2.2 Foo ',
        'open': 'open'
      },
    ],
  },
  {
    'id': 30,
    'name': '1 Foo',
    'open': 'open',
    'children': [{
        'id': 1134,
        'name': '1.1 Foo ',
        'open': 'open'
      },
      {
        'id': 1130,
        'name': '1.3 Foo ',
        'open': 'open'
      },
      {
        'id': 1123,
        'name': '1.2 Foo ',
        'open': 'open'
      },
    ],
  },
];


function SortByName(a, b) {
  var aName = a.name.toLowerCase();
  var bName = b.name.toLowerCase();
  return ((aName < bName) ? -1 : ((aName > bName) ? 1 : 0));
}


$(document).ready(function() {
  var sorted_array = arry.sort(SortByName)
  console.log(sorted_array)
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p id='data'>

</p>

【问题讨论】:

  • 你永远不会给孩子打电话.sort
  • @VLAZ 好的,那么解决方案是什么
  • @c.grey 在每个元素的子元素上调用.sort(SortByName)
  • @MakwanaPrahlad 不,它不是递归的

标签: javascript html jquery


【解决方案1】:

您需要 2 个函数来对这些对象进行排序,一个用于 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");
  }

【讨论】:

  • 您永远不需要从头开始实现两个函数来进行排序。要以相反的顺序排序,您只需要否定正确顺序的结果,因此通用reverseSort = sortingFn =&gt; (...args) =&gt; -1 * sortingFn(...args) 有效。或者您可以通过翻转参数reverseSort = fn =&gt; (a, b) =&gt; fn(a, b) 使其更具体。如果你有一个功能实用的库,你可以使用现成的解决方案sortAsc = { /* ... logic ... */ }; sortDesc = flip(sortAsc); 这样你就不必重复自己了。
【解决方案2】:

请修改你的功能如下

function SortByName(a, b){
	if(a.children){
  	a.children = a.children.sort(SortByName)
  }
  if(b.children){
  	b.children = b.children.sort(SortByName)
  }
  var aName = a.name.toLowerCase();
  var bName = b.name.toLowerCase();
  return ((aName < bName) ? -1 : ((aName > bName) ? 1 : 0));
}

【讨论】:

  • 迄今为止最好的解决方案!
  • @c.grey 我什么都没做......只是调用了你的函数本身...... :)
  • 不,这是最糟糕的解决方案,因为子元素会一遍又一遍地为每个父元素排序。
  • @c.grey 通过重复排序,排序的复杂性会更高。哎呀,基于排序算法实现,您可能会得到最差的复杂性,因为像快速排序这样的算法在已经排序的数据集上性能最差。即使避免了这种情况,也完全没有必要对孩子进行排序和重新排序。
  • @VLAZ 你有什么最佳解决方案吗?
【解决方案3】:
var updated_sorted_array = sorted_array.map(function(arr){
  arr.children = arr.children.sort(SortByName);
  return arr;
})

【讨论】:

  • 下次请添加有关原因和方式的信息和说明
【解决方案4】:

您还需要迭代数组以对所有子项进行排序。不需要赋值,因为Array#sort 会改变数组。

array.forEach(({ children }) => children.sort(sortByName));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2021-12-12
    相关资源
    最近更新 更多