关键值排序数组 [英] Sort array on key value

查看:166
本文介绍了关键值排序数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前通过排序名称的功能及价值/密钥对的数组。

我不知道如何可以通过在其上进行排序,所以我可以调用同一个函数像这样每一次的关键是:

  VAR ARR = [{名称:'鲍勃',艺术家:鲁迪},
           {名称:'johhny',艺术家:drusko},
           {名称:'斗嘴',艺术家:needell},
           {名称:'顶',艺术家:'齿轮'}]排序(ARR,'名'); //试图以按名称排序
排序(ARR,艺术家); //试图通过艺术家排序功能排序(ARR){
  arr.sort(功能(A,B){
    变种NAMEA = a.name.toLowerCase(),nameB = b.name.toLowerCase();
    如果(NAMEA< nameB)//串排序升序
      返回-1;
    如果(NAMEA> nameB)
      返回1;
    返回0; //默认返回值(不排序)
   });
}


解决方案

下面是两个排序功能,可能是有用的:

  //的价值观排序
功能SRT(DESC){
  返回功能(A,B){
   回报递减? ~~(A< B):~~(A> B);
  };
}//排序的键值
功能keysrt(键,DESC){
  返回功能(A,B){
   回报递减? ~~(A [关键]< B [关键]):~~(一个[关键]> B [关键]);
  }
}

有关阵列可以排序的名称使用:

  VAR ARR = [{名称:'鲍勃',艺术家:鲁迪'}
           {名称:'johhny',艺术家:drusko'}
           {名称:'斗嘴',艺术家:needell'}
           {名称:'顶',艺术家:'齿轮'}]
          的.sort(keysrt('名'));

您还可以结合排序功能:

 函数SRT(DESC,键){
 返回功能(A,B){
   回报递减? ~~(键[关键]< B [关键]:A< B)
               (?键[KEY]> B [关键]:A> B):~~;
  };
}

和使用

  VAR ARR = [{名称:'鲍勃',艺术家:鲁迪'}
               {名称:'johhny',艺术家:drusko'}
               {名称:'斗嘴',艺术家:needell'}
               {名称:'顶',艺术家:'齿轮'}]
              的.sort(SRT(NULL,'名'));

下面是一种全在一个解决方案中:

 功能SRT(上,下行){
 上= ON&功放;&安培; on.constructor ===对象?上 : {};
 返回功能(A,B){
   如果(on.string || ON.KEY){
     A = ON.KEY? A [ON.KEY]:一个;
     A = on.string?串(一).toLowerCase():一个;
     B = ON.KEY? B〔ON.KEY]:B;
     B = on.string?字符串(B).toLowerCase():B;
     //如果key不是present,移动到结束
     如果(ON.KEY&安培;&安培;!(B ||一)!){
      返回A和!&安培; !B' 1:一个? 1:-1;
     }
   }
   回降? ~~(on.string b.localeCompare(一):一个与所述; B)
                     :~~(on.string a.localeCompare(B):A> B);
  };
}
//用法示例
A,Z,X,Y,A,B,B,Z,A,I,J,y'.split('')排序(SRT({字符串:TRUE;}));
 // =>中,a,A,B,B,I,J,X,Y,Y,Z,Z
[100,7,8,2,2,0,5,1,6,5,-1]的.sort(SRT());
 // => -1,0,1,2,2,5,5,6,7,8,100
[100,7,8,2,2,0,5,1,6,5,-1]的.sort(SRT({},真}));
 // => 100,8,7,6,5,5,2,2,1,0,-1
VAR objarr =
 [{名称:'鲍勃',艺术家:鲁迪'}
  {名称:'Johhny',艺术家:drusko'}
  {名称:'TIFF文件',艺术家:needell'}
  {名称:'顶',艺术家:'齿轮'}]
 的.sort(SRT({关键:'名',字符串:TRUE},真实));
对于(VAR I = 0; I< objarr.length; I + = 1){
  的console.log(objarr [我]。名称);
}
// =>日志瑞伯,顶部,TIFF,连续约翰尼

I have a function which sorts by name currently and an array of value / key pairs.

I wonder how can I pass the key on which sort is being performed so I can call the same function every time like so:

var arr = [{name:'bob', artist:'rudy'},
           {name:'johhny', artist:'drusko'},
           {name:'tiff', artist:'needell'},
           {name:'top', artist:'gear'}];

sort(arr, 'name');   //trying to sort by name
sort(arr, 'artist'); //trying to sort by artist

function sort(arr) {
  arr.sort(function(a, b) {
    var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase();
    if (nameA < nameB) //sort string ascending
      return -1;
    if (nameA > nameB)
      return 1;
    return 0; //default return value (no sorting)
   });          
}

解决方案

Here are two sorting functions that may be useful:

// sort on values
function srt(desc) {
  return function(a,b){
   return desc ? ~~(a < b) : ~~(a > b);
  };
}

// sort on key values
function keysrt(key,desc) {
  return function(a,b){
   return desc ? ~~(a[key] < b[key]) : ~~(a[key] > b[key]);
  }
}

For your array you can sort on 'name' using:

var arr = [ {name:'bob', artist:'rudy'}
           ,{name:'johhny', artist:'drusko'}
           ,{name:'tiff', artist:'needell'}
           ,{name:'top', artist:'gear'}]
          .sort(keysrt('name'));

You could also combine the sorting functions:

function srt(desc,key) {
 return function(a,b){
   return desc ? ~~(key ? a[key]<b[key] : a < b) 
               : ~~(key ? a[key] > b[key] : a > b);
  };
}

And use

var arr = [ {name:'bob', artist:'rudy'}
               ,{name:'johhny', artist:'drusko'}
               ,{name:'tiff', artist:'needell'}
               ,{name:'top', artist:'gear'}]
              .sort(srt(null,'name'));

Here's a kind of an all in one solution:

function srt(on,descending) {
 on = on && on.constructor === Object ? on : {};
 return function(a,b){
   if (on.string || on.key) {
     a = on.key ? a[on.key] : a;
     a = on.string ? String(a).toLowerCase() : a;
     b = on.key ? b[on.key] : b;
     b = on.string ? String(b).toLowerCase() : b;
     // if key is not present, move to the end 
     if (on.key && (!b || !a)) {
      return !a && !b ? 1 : !a ? 1 : -1;
     }
   }
   return descending ? ~~(on.string ? b.localeCompare(a) : a < b)
                     : ~~(on.string ? a.localeCompare(b) : a > b);
  };
}
// usage examples
'a,z,x,y,a,b,B,Z,a,i,j,y'.split(',').sort( srt({string:true;}) );
 //=> ,a,a,b,B,i,j,x,y,y,z,Z
[100,7,8,2,2,0,5,1,6,5,-1].sort( srt() );
 //=> -1,0,1,2,2,5,5,6,7,8,100
[100,7,8,2,2,0,5,1,6,5,-1].sort( srt({},true}) );
 //=> 100,8,7,6,5,5,2,2,1,0,-1
var objarr = 
 [ {name:'bob', artist:'rudy'}
  ,{name:'Johhny', artist:'drusko'}
  ,{name:'Tiff', artist:'needell'}
  ,{name:'top', artist:'gear'}]
 .sort( srt({key:'name',string:true}, true) );
for (var i=0;i<objarr.length;i+=1) {
  console.log(objarr[i].name);
}
//=> logs zeb, top, Tiff, Johnny consecutively

这篇关于关键值排序数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆