为什么Array.prototype.reduce()不接受Map对象作为初始值?

时间:2016-04-28 21:10:42

标签: javascript arrays dictionary ecmascript-6 reduce

好的,由于以下原因,这个问题被搁置了;

“此问题是由无法再现的问题或简单的印刷错误引起的。”

我只是想确认问题仍然存在于stackoverflow沙箱,repl.it sanbox甚至firefox控制台上,它肯定不是一个错字。将代码复制粘贴到Firefox控制台,它将无法正常工作。

我一直在尝试根据一个特定的属性对Map对象中的几个对象进行排序。我更喜欢使用箭头函数和数组方法。似乎Array.prototype.reduce()不接受新的Map对象作为开始的初始参数。我还不明白的是,虽然Map对象不会被填充,但最后它的大小显示正确的值,就好像它一样。谁能告诉我这里发生了什么......?为什么Map对象看起来是空的,而它的大小显示为3。

var myClients = {
    'cccc': { newValue: 'test three', timeTest: 3 },
    'bbbb': { newValue: 'test two', timeTest: 2 },
    'aaaa': { newValue: 'test one', timeTest: 1 }
};

var mc = Object.keys(myClients)
    .sort((p,c) => myClients[p].timeTest <= myClients[c].timeTest ? -1 : 1)
    .reduce((p,c) => {p.set(c, myClients[c]); console.log(p.size); return p}, new Map());

console.log(mc, mc.size);

您可以尝试here

好的,我已经接受了答案,但即使在stackjoverflow沙箱中也无法正常显示。检查

var myClients = {
    'cccc': {
      newValue: 'test three',
      timeTest: 3
    },
    'bbbb': {
      newValue: 'test two',
      timeTest: 2
    },
    'aaaa': {
      newValue: 'test one',
      timeTest: 1
    }
  },
  mc = Object.keys(myClients)
    .sort((p, c) => myClients[p].timeTest <= myClients[c].timeTest ? -1 : 1)
    .reduce((p, c) => {
      p.set(c, myClients[c]);
      console.log(p.size);
      return p
    }, new Map());
document.write("<pre>" + JSON.stringify(mc, null, 2) + "</pre>");

2 个答案:

答案 0 :(得分:3)

不要相信console.log进行调试;实际使用the debugger要好得多,这样你就可以自己检查对象了。

在这种情况下,您的代码似乎工作正常;运行代码片段并查看浏览器的控制台,您应该看到您的期望。 repl.it的Map实现似乎只将"{}"的所有实例记录为var myClients = { 'cccc': { newValue: 'test three', timeTest: 3 }, 'bbbb': { newValue: 'test two', timeTest: 2 }, 'aaaa': { newValue: 'test one', timeTest: 1 } }, mc = Object.keys(myClients).sort((p, c) => myClients[p].timeTest <= myClients[c].timeTest ? -1 : 1).reduce((p, c) => { p.set(c, myClients[c]); console.log(p.size); return p }, new Map()); console.log(mc, mc.size);

{{1}}

答案 1 :(得分:1)

你的代码非常好,它是一个失败的otool -L /usr/lib/liblzma.5.dylib /usr/lib/liblzma.5.dylib: /usr/lib/liblzma.5.dylib (compatibility version 6.0.0, current version 6.3.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0) 控制台。

您可以通过按键访问Map条目来检查您的代码是否正确:

repl.it

更新:序列化地图

Map在mc.has('cccc') // true mc.get('cccc') // { newValue: 'test three', timeTest: 3 } 和Stackoverflow的片段中看起来为空的原因是它们都将它转换为字符串。

为了获得有意义的Map字符串表示,您应该覆盖其repl.it方法,如下所示:

toString

class SerializableMap extends Map {
  toString() {
    const res = {};
    for (let entry of this.entries()) {
      res[entry[0]] = entry[1];
    }
    return JSON.stringify(res);
  }
}

现在您可以轻松查看地图的状态。