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

11

可能是重复问题:
如何在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
这是对JS数组使用的错误。只有在数组中使用数值键。.sort没有起到任何作用,因为严格来说你的数组没有任何元素。在这种情况下,您必须使用对象。我建议阅读MDN-使用对象 - Felix Kling
2
同时,还有一个问题:如何按属性值对JavaScript对象进行排序 - Felix Kling
尽管被标记为重复,但下面提供的解决方案并未在重复内容中提到。 - PopeJohnPaulII
这个答案与下面所有答案中建议的几乎相同。它只是使用了一个数组的数组而不是一个对象的数组。这是一个微小的区别,不会改变解决方案的大局。对于重复问题中被接受的答案,它只提供了一种将对象编程转换为数组的方法...这比仅有硬编码示例更有用。所有这里的信息也在其他问题中提供。 - Felix Kling
请查看我的回答 https://dev59.com/IG435IYBdhLWcg3w0ThP#51116578 - danicotra
4个回答

25

数组只能有数值索引。你需要将其重写为对象或对象数组。

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;
});

我喜欢这种(数组)方法,调用并按val排序的正确方式是什么? - PopeJohnPaulII
我已更新我的答案,以包括使用对象数组按val排序。 - saml
伟大而简单的解决方案。 - Ahsan
“Object method” 的排序方式也一样吗? - Piero Alberto
@PieroAlberto 不可以依赖对象中的键顺序。对象是一组键值对,更多或更少是无序的。MDN 对此有很好的解释。 - saml

3
在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


如何按名称排序? - Muneem Habib

2

首先,创建数组并将其用作映射是不正确的。请改用对象:

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

数组是一个具有处理数值-顺序索引逻辑的类。

现在回答您的问题,映射没有顺序,不能保证迭代的顺序,因此不存在"排序映射"这样的事情。

我建议您使用一个带有键值对对象的数组:

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

或者两个数组:

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

这取决于你的需求。


1

你应该在数组中使用JavaScript对象: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;
    });

这对于字符串比较很好。 - cw24

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接