在javascript中迭代地图

时间:2013-05-12 13:28:29

标签: javascript jquery map

我有这样的结构:

var myMap = {
    partnr1: ['modelA', 'modelB', 'modelC'],
    partnr2: ['modelA', 'modelB', 'modelC']
};

我将使用它们的关联(模型)迭代每个元素(partnr)。

为了达到这个目的,我正在尝试每次迭代加倍$,但没有任何反应:

$.each(myMap, function (i, val) {
    $.each(i, function (innerKey, innerValue) {

        setTimeout(function () {
            $('#variant').fadeOut("slow", function () {
                $(this).text(innerKey + "-" + innerValue).fadeIn("slow");

            });

        }, i * 6000);

    });
});

当我使用单值数组(Object)时,我尝试实现淡入淡出的效果正常,但是当我需要为每个键设置多个值时,这种效果就不行了。

有关如何成功完成此迭代的任何想法,除了使用在这种情况下更好的地图之外还有其他方法吗?

任何建议都会引起关注。

6 个答案:

答案 0 :(得分:29)

我使用标准的javascript:

for (var m in myMap){
    for (var i=0;i<myMap[m].length;i++){
    ... do something with myMap[m][i] ...
    }
} 

请注意处理对象和数组的不同方法。

答案 1 :(得分:18)

ES6 +的功能方法

如果您想采用更实用的方法来迭代Map对象,则可以执行类似的操作

const myMap = new Map() 
myMap.forEach((value, key) => {
    console.log(value, key)
})

答案 2 :(得分:4)

从2019年开始回答您的问题:

这取决于您使用的ECMAScript版本。

Pre ES6:

使用以上任何答案,例如:

for (var m in myMap){
    for (var i=0;i<myMap[m].length;i++){
    ... do something with myMap[m][i] ...
    }
} 

对于ES6(ES 2015):

您应该使用具有Map功能的entries()对象:

var myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

for (const [key, value] of myMap.entries()) {
  console.log(key, value);
}

对于ES8(ES 2017):

引入了

Object.entries()

const object = {'a': 1, 'b': 2, 'c' : 3};
for (const [key, value] of Object.entries(object)) {
  console.log(key, value);
}

答案 3 :(得分:3)

$.each()的回调按顺序传递属性名称和值。因此,您试图在内部调用$.each()中迭代属性名称。我想你想要:

$.each(myMap, function (i, val) {
  $.each(val, function(innerKey, innerValue) {
    // ...
  });
});

在内部循环中,给定像地图这样的对象,值是数组。没关系,但请注意“innerKey”值都是数字。

编辑 - 现在一旦理顺了,这就是下一个问题:

    setTimeout(function () {

      // ...

    }, i * 6000);

第一次通过该循环,“i”将是字符串“partnr1”。因此,该乘法尝试将导致NaN。您可以保留外部计数器以跟踪外部地图的属性计数:

var pcount = 1;
$.each(myMap, function(i, val) {
  $.each(val, function(innerKey, innerValue) {
    setTimeout(function() {
      // ...
    }, pcount++ * 6000);
  });
});

答案 4 :(得分:1)

不要使用迭代器来执行此操作。通过递增回调中的计数器来维护自己的循环,并递归调用下一项的操作。

$.each(myMap, function(_, arr) {
    processArray(arr, 0);
});

function processArray(arr, i) {
    if (i >= arr.length) return;

    setTimeout(function () {
        $('#variant').fadeOut("slow", function () {
            $(this).text(i + "-" + arr[i]).fadeIn("slow");

            // Handle next iteration
            processArray(arr, ++i);
        });
    }, 6000);
}

虽然代码中存在逻辑错误。您在(大致)同时将同一容器设置为多个不同的值。也许你的意思是每个人都要更新自己的容器。

答案 5 :(得分:0)

嗯,看起来这个旧的 JQuery 线程已经被ES6 Map 用户所采用。

如果这是您要找的,我可以建议使用 Array.from() 函数将 Map 转换为 Array。这使您可以轻松地链接转换,例如 filter()map() 等。

const map = new Map([
  ['key one', 'value one'],
  ['key two', 'value two'],
]);

// Loop through key-value-pairs
Array.from(map.entries()).map(([key, val]) => console.log(key, val));

// Loop through map keys
Array.from(map.keys()).map(key => console.log(key));

// Loop through values
Array.from(map.values()).map(value => console.log(value));