如何按值对(关联)数组进行排序?

时间:2012-10-08 19:17:46

标签: javascript

  

可能重复:
  How to sort an associative array by its values in Javascript?

首先,我知道技术上Javascript没有关联数组,但我不确定如何标题并获得正确的想法。

所以这是我的代码,

var status = new Array();
status['BOB'] = 10
status['TOM'] = 3
status['ROB'] = 22
status['JON'] = 7

我希望按值对其进行排序,以便稍后在ROB首先进行循环,然后BOB等等。

我试过了,

status.sort()
status.sort(function(a, b){return a[1] - b[1];});

但他们似乎都没有做任何事情。

将阵列打印到控制台之前和之后以相同的顺序出现。

4 个答案:

答案 0 :(得分:23)

数组只能有数字索引。您需要将其重写为Object或Object of Array。

var status = new Object();
status['BOB'] = 10
status['TOM'] = 3
status['ROB'] = 22
status['JON'] = 7

var status = new Array();
status.push({name: 'BOB', val: 10});
status.push({name: 'TOM', val: 3});
status.push({name: 'ROB', val: 22});
status.push({name: 'JON', val: 7});

如果您喜欢status.push方法,可以使用以下方法对其进行排序:

status.sort(function(a,b) {
    return a.val - b.val;
});

答案 1 :(得分:2)

首先 - 创建一个数组以将其用作映射是不正确的。而是使用Object:

var status = {};
status['BOB'] = 10;

Array是一个具有处理数字序列索引的逻辑的类。

现在回答您的回复,Mappings没有订单,无法保证它将迭代的顺序,因此没有“排序映射”这样的事情

我很高兴你使用一个带有键值的对象数组:

var status = [];
status.push({ key: 'BOB', value: 10 });

或两个阵列:

var status = {
    keys: [],
    values: []
};
status.keys.push('BOB');
status.value.push(10);

这取决于您的需求。

答案 2 :(得分:2)

javascript中的“数组”以数字方式编入索引。 “对象”就是你所谓的关联数组。 “物体”本质上是无序的。

为此,您需要稍微更改一下数据结构。

var arr = []; // Array

// push a few objects to the array.
arr.push({name: 'BOB', age: 10});
arr.push({name: 'TOM', age: 3});
arr.push({name: 'ROB', age: 22});
arr.push({name: 'JON', age: 7});

var sorted = arr.sort(function(a, b) {
  return a.age - b.age;
});

console.log(sorted);

enter image description here

答案 3 :(得分:1)

您应该在Array中使用JavaScript Object:jsfidle

       var status = new Array();
    status.push({key: 'BOB', value: 10});
    status.push({key: 'TOM', value: 3});
    status.push({key: 'ROB', value: 22});
    status.push({key: 'JON', value: 7});
   status.sort(function(a, b){

       if(a.value > b.value){
        return -1;
       }
        else if(a.value < b.value){
        return 1;
       } 
       return 0;
    });