【问题标题】:Simple function to sort an array of objects对对象数组进行排序的简单函数
【发布时间】:2011-12-31 18:49:42
【问题描述】:

我想创建一个(非匿名)函数,该函数通过键 name 按字母顺序对对象数组进行排序。我只编写直接的 JavaScript 代码,所以框架对我没有任何帮助。

var people = [
    {'name': 'a75', 'item1': false, 'item2': false},
    {'name': 'z32', 'item1': true,  'item2': false},
    {'name': 'e77', 'item1': false, 'item2': false}
];

【问题讨论】:

  • 到目前为止你有什么?为什么你明确想要一个非匿名函数?
  • 一个非匿名函数排序(json_object,key_to_sort_by) {}
  • 加了引号,好几天没写代码了!只想弄清楚 JSON 和 JavaScript 如何设置键然后排序。如果它不是基于整数的,我可以使用 sort 方法吗?
  • 匿名函数示例:window.onload = function() {/* stuff();*/}
  • 你上面列出的不是 JSON,它是一个普通的 JavaScript 对象。 JSON 是 JavaScript 对象的字符串编码版本。

标签: javascript sorting


【解决方案1】:

这个怎么样?

var people = [
{
    name: 'a75',
    item1: false,
    item2: false
},
{
    name: 'z32',
    item1: true,
    item2: false
},
{
    name: 'e77',
    item1: false,
    item2: false
}];

function sort_by_key(array, key)
{
 return array.sort(function(a, b)
 {
  var x = a[key]; var y = b[key];
  return ((x < y) ? -1 : ((x > y) ? 1 : 0));
 });
}

people = sort_by_key(people, 'name');

这允许您指定要对数组进行排序的键,这样您就不会局限于硬编码的名称排序。它将用于对所有共享用作键的属性的任何对象数组进行排序。我相信这就是您要找的东西?

这是一个 jsFiddle:http://jsfiddle.net/6Dgbu/

【讨论】:

  • 可以按2键排序吗?例如。 “姓氏”,“名字”? (类似于 mysql 的 ORDER BY 字段)。谢谢!
  • @DavidBrainer-Banker - 我真的很喜欢这个答案中的解决方案 - 如果我想按多个键排序怎么办?这种解决方案是否可行,或者以另一种方式更好地处理?
  • 它不适用于大写/小写值。请使用var x = a[key].toLowerCase(); var y = b[key].toLowerCase();更新代码
  • 这个算法搞乱了堆栈排序。请修复
  • 来自 StackSort 的您好!很好的答案,做的工作。
【解决方案2】:

您可以使用.sort 函数对数组 ([...]) 进行排序:

var people = [
    {'name': 'a75', 'item1': false, 'item2': false},
    {'name': 'z32', 'item1': true,  'item2': false},
    {'name': 'e77', 'item1': false, 'item2': false},
];

var sorted = people.sort(function IHaveAName(a, b) { // non-anonymous as you ordered...
    return b.name < a.name ?  1 // if b should come earlier, push a to end
         : b.name > a.name ? -1 // if b should come later, push a to begin
         : 0;                   // a and b are equal
});

【讨论】:

  • 谢谢,虽然这是一个烦人的功能,但我正在尝试执行功能 sort_example(object_name,key_to_sort_by) {}
  • @John:现在是命名函数表达式了 :) 你想要的不是太难,试试看。
  • 所以在排序后我应该控制台、排序或人员
【解决方案3】:

这本身不是 JSON 问题。它是一个 javascript 数组问题。

试试这个:

people.sort(function(a,b){ 
    var x = a.name < b.name? -1:1; 
    return x; 
});

【讨论】:

  • 我正在尝试执行功能 sort_example(object_name,key_to_sort_by) {}
  • +1 我用它来对价格进行排序,我只是将括号'',然后将价格从最低到最高排序。谢谢!
  • 这可能会很糟糕,因为比较返回 1 的相同元素。根据排序功能的用户,任何事情都可能发生。
【解决方案4】:

我使用 ECMA 6 解决类似排序问题的方法

var library = [
        {name: 'Steve', course:'WAP', courseID: 'cs452'}, 
        {name: 'Rakesh', course:'WAA', courseID: 'cs545'},
        {name: 'Asad', course:'SWE', courseID: 'cs542'},
];

const sorted_by_name = library.sort( (a,b) => a.name > b.name );

for(let k in sorted_by_name){
    console.log(sorted_by_name[k]);
}

【讨论】:

  • 虽然对浏览器共享/兼容性具有主观性,但很有趣。如果它可以在 IE11 中运行,那么 2017 兼容性是公平的,否则如果它需要 IE12(“Edge”),则必须等到大约 2020 年。看起来语言稍微少一些……尽管当我最初发布这个时,我要求匿名我可以调用的函数。
  • 你确定这是为了按照标准工作吗?字符串上的 &lt; 在节点 v14.17.0 上仅返回 truefalse,而不是所需的 -1、0、1。
【解决方案5】:

我使用 lambda 修改了@Geuis 的答案并首先将其转换为大写:

people.sort((a, b) => a.toLocaleUpperCase() < b.toLocaleUpperCase() ? -1 : 1);

【讨论】:

    【解决方案6】:
    Array.prototype.sort_by = function(key_func, reverse=false){
        return this.sort( (a, b) => ( key_func(b) - key_func(a) ) * (reverse ? 1 : -1) ) 
    }
    

    那么例如如果我们有

    var arr = [ {id: 0, balls: {red: 8,  blue: 10}},
                {id: 2, balls: {red: 6 , blue: 11}},
                {id: 1, balls: {red: 4 , blue: 15}} ]
    

    arr.sort_by(el => el.id, reverse=true)
    /* would result in
    [ { id: 2, balls: {red: 6 , blue: 11 }},
      { id: 1, balls: {red: 4 , blue: 15 }},
      { id: 0, balls: {red: 8 , blue: 10 }} ]
    */
    

    arr.sort_by(el => el.balls.red + el.balls.blue)
    /* would result in
    [ { id: 2, balls: {red: 6 , blue: 11 }},    // red + blue= 17
      { id: 0, balls: {red: 8 , blue: 10 }},    // red + blue= 18
      { id: 1, balls: {red: 4 , blue: 15 }} ]   // red + blue= 19
    */
    

    【讨论】:

      【解决方案7】:

      var data = [ 1, 2, 5, 3, 1]; data.sort(function(a,b) { return a-b });

      用一个小的比较器和排序,我们可以做到

      【讨论】:

        【解决方案8】:

        这就是我从前面的例子中简单排序的方式:

        如果我的数组是items:

        0: {id: 14, auctionID: 76, userID: 1, amount: 39}
        1: {id: 1086, auctionID: 76, userID: 1, amount: 55}
        2: {id: 1087, auctionID: 76, userID: 1, amount: 55}
        

        我以为只需调用items.sort() 就可以对其进行排序,但有两个问题: 1. 对它们进行排序 2. 将它们排序为第一个键

        这是我修改排序功能的方式:

        for(amount in items){
        if(item.hasOwnProperty(amount)){
        
        i.sort((a, b) => a.amount - b.amount);
        }
        }
        

        【讨论】:

          【解决方案9】:

          var library = [
                  {name: 'Steve', course:'WAP', courseID: 'cs452'}, 
                  {name: 'Rakesh', course:'WAA', courseID: 'cs545'},
                  {name: 'Asad', course:'SWE', courseID: 'cs542'},
          ];
          
          const sorted_by_name = library.sort( (a,b) => a.name > b.name );
          
          for(let k in sorted_by_name){
              console.log(sorted_by_name[k]);
          }

          【讨论】:

          • 在回答问题时,最好在代码中加入一些解释性文字。
          • 比较函数返回一个布尔值,它应该返回一个数字
          【解决方案10】:
          var people = 
          [{"name": 'a75',"item1": "false","item2":"false"}, 
          {"name": 'z32',"item1": "true","item2":  "false"}, 
          {"name": 'e77',"item1": "false","item2": "false"}]; 
          
          function mycomparator(a,b) {   return parseInt(a.name) - parseInt(b.name);  } 
          people.sort(mycomparator); 
          

          可能是这样的(或者正如我们过去所说,这应该有效)。

          【讨论】:

          • parseInt('a75')NaN 所以我猜这不会真的起作用。
          • 当我们处理字符串值时,我认为这不是合适的解决方案,因为字符串上的 parseInt 可能会给出意想不到的值,但是如果您正在比较具有数字或十进制值的字符串,那么它会工作
          猜你喜欢
          • 2015-12-30
          • 2011-08-18
          • 2022-01-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多