2

我正在尝试在 JavaScript 中创建地图或字典样式的数据结构。每个字符串键都指向一个 int 数组,我想对键指向的数组做一些简单的事情。

我有一堆动物,每个都有一个 ID (1,2,3,...)。我想把这些放在地图上,这样我就知道 1,4,5 是猫,2,3,6 是狗。

这就是我所拥有的代码来更好地解释它。

var myMap = {};
myMap["cats"] = new Array(1,4,5);   //animals 1,4,5 are cats
myMap["dogs"] = new Array(2,3,6);   //animals 2,3,6 are dogs  

1)我如何向数组中添加一些东西?例如,如果动物 #7 是一只猫,那么下面的代码是否正确?

myMap["cats"].push(7);   //so that myMap["cats"] is now an array with [1,4,5,7]

2)我将如何对地图进行排序,以便键按数组中的项目数排序?在这种情况下,myMap["cats"] 将在 myMap["dogs"] 之前,因为 "cats" 的数组比 "dogs" 的数组有更多的项目。下面的代码是正确的吗?

myMap.sort(function(a,b){return myMap[b].length - myMap[a].length});

如果在 JavaScript 中有更有效的方法可以做到这一点,请告诉我。太感谢了!

4

3 回答 3

8

似乎您已经回答了自己的第一个问题。


至于第二个问题,您需要另一个 Array 来维护映射键的排序顺序。

var mapKeys = Object.keys(myMap);

mapKeys.sort(function(a,b){return myMap[b].length - myMap[a].length});

然后您可以迭代mapKeys以按您的排序顺序获取集合。

mapKeys.forEach(function(key) {
    console.log("Processing ", key);
    var indices = myMap[key];
});
于 2013-05-10T01:42:31.070 回答
3

1) 是的,push会起作用(就像unshift或一样splice)。

2) 对象键本质上是无序的,因此它们没有sort函数:-) 您可以向地图添加一个函数以按排序顺序返回值:

myMap.sort = function sortMap(sortFunc) {
    var results = [];
    for (key in this) {
        if (this.hasOwnProperty(key) && this[key] !== sortMap) {
            results.push(this[key]);
        }
    }
    return results.sort(sortFunc);
};

myMap.sort(function(a, b) { return a.length - b.length; });

一些注意事项:

  • 不要使用Arrayornew Array除非你需要(例如Array(12).join("-")创建一个由 11 个破折号组成的字符串)。而是使用数组文字语法[]。它更清晰(在大多数浏览器中实际上更快)。
  • 如有疑问,请在浏览器中打开 MDN 和控制台并尝试一下。
于 2013-05-10T01:41:33.793 回答
1

我将如何对地图进行排序,以便键按数组中的项目数排序?

{ 'cats': [1,4,5], 'dogs': [2,3,6] }地图没有顺序 -和之间没有区别{ 'dogs': [2,3,6], 'cats': [1,4,5] }

至于你的其他问题——是的,这都是正确的。但不是这样写:

var myMap = {};
myMap["cats"] = new Array(1,4,5);   //animals 1,4,5 are cats
myMap["dogs"] = new Array(2,3,6);   //animals 2,3,6 are dogs  

我建议这样写:

var myMap = {
    'cats': [1,4,5], //animals 1,4,5 are cats
    'dogs': [2,3,6]  //animals 2,3,6 are dogs  
};

或者这个:

var animals = [ 'cats', 'dogs', 'dogs', 'cats', 'cats', 'dogs' ];
于 2013-05-10T01:39:09.427 回答