JavaScript:映射式数组、排序和添加
我正在尝试用JavaScript创建一个地图或字典样式的数据结构。每个字符串键指向一个int数组,我想用这些键指向的数组做一些简单的事情 我有一群动物,每个都有一个ID(1,2,3,…)。我想把这些放在地图上,这样我知道1,4,5是猫,2,3,6是狗 下面是我为代码提供的更好的解释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
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
以创建一个包含11个破折号的字符串)。而是使用数组文字语法Array(12)。连接(“-”
。它更清晰(在大多数浏览器中实际上更快)[]
- 如果有疑问,请在浏览器中打开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]
。