简体   繁体   English

按2个属性对对象数组进行排序

[英]Sorting an Array of Objects by 2 Properties

I have an array of objects like this: 我有一个这样的对象数组:

[ {x: 1, y: 4}, {x: 1, y: 2}, {x: 1, y: 3},
  {x: 3, y: 4}, {x: 3, y: 2}, {x: 3, y: 9},
  {x: 2, y: 5}, {x: 1, y: 0}, {x: 1, y: 2} ]

and I'd like to sort it like this: 我想这样排序:

[ {x: 1, y: 2}, {x: 1, y: 3}, {x: 1, y: 4},
  {x: 2, y: 0}, {x: 2, y: 2}, {x: 2, y: 5},
  {x: 3, y: 2}, {x: 3, y: 4}, {x: 3, y: 9} ]

so the rule is: the array has to be sorted first by the x property, and then the sorting by the y property has to observe the first sorting. 所以规则是:数组必须首先按x属性排序,然后y属性的排序必须遵守第一个排序。

How can I do that? 我怎样才能做到这一点?

I tried: 我试过了:

array.sort(function(a, b){
 var elema = a["x"] ;
 var elemb = b["x"] ;
 if (elema < elemb) 
  return -1;
 if (elema > elemb)
  return 1;
 return 0;
});

array.sort(function(a, b){
 var elema = a["y"] ;
 var elemb = b["y"] ;
 if (elema < elemb) 
  return -1;
 if (elema > elemb)
  return 1;
 return 0;
});

but it does not work properly. 但它不能正常工作。

Thanks 谢谢

You have to do it in one function. 你必须在一个功能中完成它。
Also, if x values are the same, you must compare on y values. 此外,如果x值相同,则必须比较y值。

You can do it this way 你可以这样做

function SortMyObjects(a, b) 
{
   if (a.x < b.x)
      return -1;

   if (a.x > b.x)
      return 1;

   // a.x == b.x so compare y values
   if (a.y < b.y)
      return -1;

   if (a.y > b.y)
      return 1;

   // perfect equality
   return 0;
}

// sort your array
array.sort(SortMyObjects);

You can do it in one line with Alasql JavaScript library. 您可以使用Alasql JavaScript库在一行中完成 This is an example: 这是一个例子:

var res = alasql('SELECT * FROM ? ORDER BY x,y',[data]);

Try this example at jsFiddle . 在jsFiddle上试试这个例子。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM