0
点赞
收藏
分享

微信扫一扫

js 顺序与迭代

与 Object 类型的一个主要差异是,Map 实例会维护键值对的插入顺序,因此可以根据插入顺序执 行迭代操作。

映射实例可以提供一个迭代器(Iterator),能以插入顺序生成[key, value]形式的数组。可以 通过 entries()方法(或者 Symbol.iterator 属性,它引用 entries())取得这个迭代器:

const m = new Map([
      ["key1", "val1"],
      ["key2", "val2"],
      ["key3", "val3"]
]);
    alert(m.entries === m[Symbol.iterator]); // true
    for (let pair of m.entries()) {
      alert(pair);
    }
    // [key1,val1]
    // [key2,val2]
    // [key3,val3]
    for (let pair of m[Symbol.iterator]()) {
      alert(pair);
    }
    // [key1,val1]
    // [key2,val2]
    // [key3,val3]

因为 entries()是默认迭代器,所以可以直接对映射实例使用扩展操作,把映射转换为数组:

const m = new Map([
      ["key1", "val1"],
      ["key2", "val2"],
      ["key3", "val3"]
]);
console.log([...m]); // [[key1,val1],[key2,val2],[key3,val3]]

如果不使用迭代器,而是使用回调方式,则可以调用映射的forEach(callback,opt_thisArg) 方法并传入回调,依次迭代每个键/值对。传入的回调接收可选的第二个参数,这个参数用于重写回调 内部 this 的值:

const m = new Map([
      ["key1", "val1"],
      ["key2", "val2"],
      ["key3", "val3"]
]);
    m.forEach((val, key) => alert(`${key} -> ${val}`));
    // key1 -> val1
    // key2 -> val2
    // key3 -> val3
keys()和 values()分别返回以插入顺序生成键和值的迭代器:
    const m = new Map([
      ["key1", "val1"],
      ["key2", "val2"],
      ["key3", "val3"]
]);
for (let key of m.keys()) { alert(key);
    }
    // key1
    // key2
    // key3
for (let key of m.values()) { alert(key);
    }
    // value1
    // value2
    // value3

举报

相关推荐

0 条评论