Javascript 为什么不';t Array.prototype.reduce()是否接受映射对象作为初始值?

Javascript 为什么不';t Array.prototype.reduce()是否接受映射对象作为初始值?,javascript,arrays,dictionary,ecmascript-6,reduce,Javascript,Arrays,Dictionary,Ecmascript 6,Reduce,好的,这个问题被搁置,原因如下: “这个问题是由一个无法再复制的问题或一个简单的印刷错误引起的。” 我只想确认,到目前为止,stackoverflow sandbox、repl.it sanbox甚至firefox控制台上仍然存在这个问题,而且肯定不是打字错误。将代码复制粘贴到Firefox控制台,它将无法正常工作 我一直在尝试根据一个特定属性对地图对象中的几个对象进行排序。我更喜欢使用箭头函数和数组方法。似乎Array.prototype.reduce()不接受新的映射对象作为初始参数。我也不

好的,这个问题被搁置,原因如下:

“这个问题是由一个无法再复制的问题或一个简单的印刷错误引起的。”

我只想确认,到目前为止,stackoverflow sandbox、repl.it sanbox甚至firefox控制台上仍然存在这个问题,而且肯定不是打字错误。将代码复制粘贴到Firefox控制台,它将无法正常工作

我一直在尝试根据一个特定属性对地图对象中的几个对象进行排序。我更喜欢使用箭头函数和数组方法。似乎
Array.prototype.reduce()
不接受新的映射对象作为初始参数。我也不明白的是,虽然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);
var myClients={
'cccc':{newValue:'test third',timeTest:3},
'bbbb':{newValue:'test two',timeTest:2},
'aaaa':{newValue:'testone',timeTest:1}
};
var mc=Object.keys(MyClient)
.sort((p,c)=>myClients[p].timeTest{p.set(c,myClients[c]);console.log(p.size);返回p},new Map();
控制台日志(mc,mc大小);
你可以试试看

好的,我已经接受了一些答案,但即使在stackjoverflow沙箱中,它也不会正确显示。检查一下

var myClients={
"中交":{
newValue:'测试三',
时间测试:3
},
‘bbbb’:{
newValue:'测试二',
时间测试:2
},
“aaaa”:{
newValue:'测试一',
时间测试:1
}
},
mc=Object.keys(MyClient)
.sort((p,c)=>myClients[p].timeTest{
p、 set(c,myClients[c]);
控制台日志(p.size);
返回p
},新地图());

write(“+JSON.stringify(mc,null,2)+”)
不信任console.log进行调试;最好是实际使用,这样您就可以自己检查对象了

mc.has('cccc') // true
mc.get('cccc') // { newValue: 'test three', timeTest: 3 }
在这种情况下,您的代码似乎工作正常;运行代码段并在浏览器的控制台中查看,您应该会看到预期的结果。repl.它的
console.log的实现似乎只是将
Map
的所有实例都记录为
“{}”

var myClients={
"中交":{
newValue:'测试三',
时间测试:3
},
‘bbbb’:{
newValue:'测试二',
时间测试:2
},
“aaaa”:{
newValue:'测试一',
时间测试:1
}
},
mc=Object.keys(myClients).sort((p,c)=>myClients[p].timeTest{
p、 set(c,myClients[c]);
控制台日志(p.size);
返回p
},新地图());

控制台日志(mc,mc大小)
不信任console.log
进行调试;最好是实际使用,这样您就可以自己检查对象了

在这种情况下,您的代码似乎工作正常;运行代码段并在浏览器的控制台中查看,您应该会看到预期的结果。repl.它的
console.log的实现似乎只是将
Map
的所有实例都记录为
“{}”

var myClients={
"中交":{
newValue:'测试三',
时间测试:3
},
‘bbbb’:{
newValue:'测试二',
时间测试:2
},
“aaaa”:{
newValue:'测试一',
时间测试:1
}
},
mc=Object.keys(myClients).sort((p,c)=>myClients[p].timeTest{
p、 set(c,myClients[c]);
控制台日志(p.size);
返回p
},新地图());

控制台日志(mc,mc大小)您的代码非常好,它是一个
repl。它是一个失败的
控制台

通过按键访问地图条目,可以检查代码是否正确:

class SerializableMap extends Map {
  toString() {
    const res = {};
    for (let entry of this.entries()) {
      res[entry[0]] = entry[1];
    }
    return JSON.stringify(res);
  }
}
更新:序列化映射 Map在
repl.it
和Stackoverflow的代码段中看起来是空的原因是它们都在将其转换为字符串

为了获得有意义的地图字符串表示,您应该覆盖其
toString
方法,如下所示:

var myClients={
'cccc':{newValue:'test third',timeTest:3},
'bbbb':{newValue:'test two',timeTest:2},
'aaaa':{newValue:'testone',timeTest:1}
};
类SerializableMap扩展映射{
toString(){
常数res={};
for(让输入this.entries()){
res[entry[0]]=条目[1];
}
返回JSON.stringify(res);
}
}
var mc=Object.keys(MyClient)
.sort((p,c)=>myClients[p].timeTest{p.set(c,myClients[c]);console.log(p.size);返回p},new SerializableMap();

document.write(mc)
您的代码非常好,它是一个
repl.it
控制台,失败了

mc.has('cccc') // true
mc.get('cccc') // { newValue: 'test three', timeTest: 3 }
通过按键访问地图条目,可以检查代码是否正确:

class SerializableMap extends Map {
  toString() {
    const res = {};
    for (let entry of this.entries()) {
      res[entry[0]] = entry[1];
    }
    return JSON.stringify(res);
  }
}
更新:序列化映射 Map在
repl.it
和Stackoverflow的代码段中看起来是空的原因是它们都在将其转换为字符串

为了获得有意义的地图字符串表示,您应该覆盖其
toString
方法,如下所示:

var myClients={
'cccc':{newValue:'test third',timeTest:3},
'bbbb':{newValue:'test two',timeTest:2},
'aaaa':{newValue:'testone',timeTest:1}
};
类SerializableMap扩展映射{
toString(){
常数res={};
for(让输入this.entries()){
res[entry[0]]=条目[1];
}
返回JSON.stringify(res);
}
}
var mc=Object.keys(MyClient)
.sort((p,c)=>myClients[p].timeTest{p.set(c,myClients[c]);console.log(p.size);返回p},new SerializableMap();

document.write(mc)
我无法复制,您的代码工作正常。到底什么是未经批准的?@Bergi我依赖于repl.it控制台。。这似乎就是问题所在(@Bergi除了Chrome控制台之外,它似乎在任何地方都不起作用。例如,Firefox无法正常运行。因此它是可复制的,当然不是打字错误。我无法复制,你的
mc.has('cccc') // true
mc.get('cccc') // { newValue: 'test three', timeTest: 3 }