Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:映射式数组、排序和添加_Javascript_Arrays_Map - Fatal编程技术网

JavaScript:映射式数组、排序和添加

JavaScript:映射式数组、排序和添加,javascript,arrays,map,Javascript,Arrays,Map,我正在尝试用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

我正在尝试用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]
myMap.sort(function(a,b){return myMap[b].length - myMap[a].length});
2) 我如何对地图进行排序,以便键按其数组中的项数排序?在这种情况下,myMap[“cats”]将位于myMap[“dogs”]的前面,因为“cats”数组的项目比“dogs”数组的项目多。以下代码是否正确

myMap["cats"].push(7);   //so that myMap["cats"] is now an array with [1,4,5,7]
myMap.sort(function(a,b){return myMap[b].length - myMap[a].length});
如果有更有效的方法在JavaScript中实现这一点,请让我知道。非常感谢你

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

地图没有顺序-在
{'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 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' ];
1) 是的,会起作用(就像或一样)

2) 对象键本质上是无序的,因此它们没有函数:-)您可以向映射中添加函数以按排序顺序返回值,但是:

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; });
一些注意事项:

  • 除非需要,否则不要使用
    Array
    newarray
    (例如
    Array(12)。连接(“-”
    以创建一个包含11个破折号的字符串)。而是使用数组文字语法
    []
    。它更清晰(在大多数浏览器中实际上更快)
  • 如果有疑问,请在浏览器中打开MDN和控制台并进行尝试

    • 看来你已经回答了自己的第一个问题


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

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

      然后,您可以迭代
      映射键
      ,以按排序顺序获取集合

      mapKeys.forEach(function(key) {
          console.log("Processing ", key);
          var indices = myMap[key];
      });
      

      您第一次提到的两个对象之间存在差异@MartinCortez-是的,但这是因为它们是不同的对象,而不是因为它们的键处于不同的源顺序;-)@我不是在质疑他们为什么不同。我只是指出说没有区别是错误的。@MartinCortez:那没有意义。您必须意识到,
      {}=={}
      的计算结果也是
      false
      (因为每次出现
      {}
      都会实例化一个新对象);因此,您会坚持认为
      {}
      {}
      之间有区别吗?除了说没有区别是错误的之外,我不会坚持其他任何观点,正如您在上面所做的那样,小心使用
      新数组():如果向其传递单个数字,它将初始化具有该长度的数组,而不是内部具有该数字的数组。最好使用数组文字,如
      [1,4,5]