通过JS Map组装数据

时间:2018-06-08 02:30:06

标签: javascript

代码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执行的顺序吗? 非常感谢

1 个答案:

答案 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'))