代码1:
let commap = new Map();
data.forEach(function(item,index){
if(commap.has(item.comp)){
let arr = companyset.get(item.comp);
arr.push(item);
commap.set(item.comp,arr);
}else{
commap.set(item.comp,[item]);
}
});
码2:
let commap = new Map();
data.forEach(function(item,index){
commap .set(item.comp,commap.has(item.comp)?commap.get(item.comp).push(item):[item]);
});
两段代码的逻辑是相同的,如果公司有多个条目,code2会抛出一个错误:' Uncaught TypeError:commap.get(...)。push不是功能&#39 ;, 为什么会出现这个错误,这是js执行的顺序吗? 非常感谢
答案 0 :(得分:0)
问题是.push
返回数组的新长度,而不是数组本身。因此,当您set
的值为companyset.get(item.company).push(item)
时,您将值设置为数字,而不是数组,这意味着当您稍后尝试push
,抛出错误。
请记住,非原始数组可以简单地通过引用数组进行更改,而无需重新赋值。您第一次遇到新set
时只需company
。尝试这样的事情:
const data = [
{ company: 'foo' },
{ company: 'bar' },
{ company: 'foo' },
{ company: 'foo' },
];
const companyset = new Map();
data.forEach(function(item) {
const { company } = item;
const arr = companyset.get(company);
if (!arr) return companyset.set(company, [item]);
arr.push(item);
});
console.log(companyset.get('foo'));
但是要将数组合并到一个对象中,使用reduce
而不是forEach
更合适:
const data = [
{ company: 'foo' },
{ company: 'bar' },
{ company: 'foo' },
{ company: 'foo' },
];
const companyset = data.reduce((map, item) => {
const { company } = item;
const arr = map.get(company);
if (!arr) map.set(company, [item]);
else arr.push(item);
return map;
}, new Map());
console.log(companyset.get('foo'))