题目如下:
将数组
[{ name: '1', type: 0 }, { name: '2', type: 0 }, { name: '3', type: 2 }, { name: '6', type: 3 }, { name: '4', type: 2 }, { name: '5', type: 3 }];转换为[{type:0,values:[{name:'1',type:0},{name:'2',type:0}]},{type:2,values:[{name:'3',type:2},{name:'3',type:2}]},{type:3,values:[{name:'5',type:3},{name:'6',type:3}]},]的模式
Answer:
临时写两种:
1、利用对象key的唯一性(简单解决)
const oldArray = [ { name: '1', type: 0 }, { name: '2', type: 0 }, { name: '3', type: 2 }, { name: '6', type: 3 }, { name: '4', type: 2 }, { name: '5', type: 3 }, ]; const obj = {}; const processArr = oldArray.forEach(item => { if (!obj[item.type]) { obj[item.type] = [item]; } else { obj[item.type] = obj[item.type].concat(item); 这里如果是赋值模式的就不要用push,他会扭转原数组。所以此处用concat; 想用push能够间接写成: obj[item.type].push(item) } } ); console.log('obj>>>', obj); 再对obj做解决即可取得所求
剖析: 这道面试题次要是依据type分类解决,首先要把数组里反复的化为惟一的,想到这里就能够利用对象key 的唯一性进行解决,又因为指标数组的values是须要原来的type往里塞,所以能够用数组办法对对象key对应的value进行填充。最初获取到解决后的对象后续操作就简略了。
2、利用Set办法进行去重(简略办法)
const oldArray = [ { name: '1', type: 0 }, { name: '2', type: 0 }, { name: '3', type: 2 }, { name: '6', type: 3 }, { name: '4', type: 2 }, { name: '5', type: 3 }, ];const handledArr=[...new Set(oldArray.map(item=>item.type)].map(_item=>({type:_item,values:oldArray.filter(__item=>__item===_item) }) )
用这种办法很简洁,然而思路和下面对象key的唯一性是一样的。 首先要把type化为惟一,引入Set化为类数组,再依据开展运算符解决为真正的数组。再依据数组map办法对此进行解决,把数组的每一项格式化为指标数组;针对values的解决就是应用数组的filter办法进行筛选原数组返回咱们须要的type类型。
总结:这道面试题笼罩到了数组的多种办法:filter、concat、push、map,有小伙伴想理解数组的其余以及类数组能够浏览我另一篇文章:https://segmentfault.com/a/11...
也心愿能有更多同好能够留言进行技术交换,咱们共同进步!