在javascript中,是否有一种通过值对键值对进行排序的简单方法,并返回键?

时间:2011-02-11 12:44:05

标签: javascript jquery sorting key-value

在javascript中,是否有一种通过值对键值对进行排序的简单方法(假设值为数字),并返回键?使用jQuery方法也很有用。

(这里有很多关于键值对的相关问题,但我找不到一个关于排序的问题。)

5 个答案:

答案 0 :(得分:20)

这种跨浏览器并不容易。假设一个数组如

var a = [
    {key: "foo", value: 10},
    {key: "bar", value: 1},
    {key: "baz", value: 5}
];

...您可以按以下方式获取按key排序的value属性数组:

var sorted = a.slice(0).sort(function(a, b) {
   return a.value - b.value;
});

var keys = [];
for (var i = 0, len = sorted.length; i < len; ++i) {
    keys[i] = sorted[i].key;
}

// keys is ["bar", "baz", "foo"];

答案 1 :(得分:7)

我们假设我们Array Objects,如:

var data = [
    {foo: 6},
    {foo: 2},
    {foo: 13},
    {foo: 8}
];

我们可以致电Array.prototype.sort()help,使用Array.prototype.map()help来映射新数组,使用Object.keys()help来获取密钥:

var keys = data.sort(function(a,b) {
    return a.foo - b.foo;
}).map(function(elem, index, arr) {
   return Object.keys(elem)[0];
});

请注意,Array.prototype.map()需要Javascript 1.6 ,而Object.keys()是ECMAscript5(需要Javascript 1.8.5 )。

您可以在MDC上找到所有这些方法的替代代码。

答案 2 :(得分:4)

据我所知,没有内置的Javascript函数可以通过键对数组进行排序。

但是,它不应该占用太多代码:只需将密钥提取到自己的数组中,使用普通的sort函数对它们进行排序,然后按正确的顺序重建数组。这样的事情可以解决问题:

function SortArrayByKeys(inputarray) {
  var arraykeys=[];
  for(var k in inputarray) {arraykeys.push(k);}
  arraykeys.sort();

  var outputarray=[];
  for(var i=0; i<arraykeys.length; i++) {
      outputarray[arraykeys[i]]=inputarray[arraykeys[i]];
  }
  return outputarray;
}

现在您可以像这样调用您的函数:

var myarray = {'eee':12, 'blah':34 'what'=>66, 'spoon':11, 'snarglies':22};
myarray = SortArrayByKeys(myarray);

输出将是:

{'blah':34, 'eee':12, 'spoon':11, 'snarglies':22, 'what':66}

希望有所帮助。

此处的工作测试页:http://jsfiddle.net/6Ev3S/

答案 3 :(得分:4)

鉴于

var object = {
  'a': 5,
  'b': 11,
  'c': 1,
  'd': 2,
  'e': 6
}

您可以使用以下内容按其值对object个键进行排序:

Object.keys(object).sort(function (a, b) {
  return object[a] - object[b]
}))

结果

[ 'c', 'd', 'a', 'e', 'b' ]

答案 4 :(得分:1)

如果你不能指望exended数组和对象属性,

您可以使用原始的Array方法 -

function keysbyValue(O){
    var A= [];
    for(var p in O){
        if(O.hasOwnProperty(p)) A.push([p, O[p]]);
    }
    A.sort(function(a, b){
        var a1= a[1], b1= b[1];
        return a1-b1;
    });
    for(var i= 0, L= A.length; i<L; i++){
        A[i]= A[i][0];
    }
    return A;
}
//test

    var Obj={a: 20, b: 2, c: 100, d: 10, e: -10};
    keysbyValue(Obj)

    /*  returned value: (Array)
    e,b,d,a,c
    */