记面试碰到的一题

Snipaste_20200528_223145.jpg
大概就是这样的一题

          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
var array = [ { id: 1, spec: 1 }, { id: 5, spec: 2 }, { id: 2, spec: 5 }, { id: 2, spec: 10 }, { id: 1, spec: 12 }, { id: 3, spec: 12 }, { id: 4, spec: 15 }, { id: 3, spec: 16 } ] 转变为 [ { id: 1, spec: [ 1, 12 ] }, { id: 5, spec: [ 2 ] }, { id: 2, spec: [ 5, 10 ] }, { id: 3, spec: [ 12, 16 ] }, { id: 4, spec: [ 15 ] } ]

面试时一开始的思路是把id迭代出来,再去重,然后再迭代原数组,判断id是否在id的数组里。然后filter那个id的元素,然后说着说着就有些乱了。。。用纸和笔写js的代码真是写不出来,功力不够啊

回到家,重新理一遍,用上vscode,撸出了下面的代码。

大概思路是出现过得id添加到了idarray里,也不用去重,然后迭代数组每一项,id出现过就创建一个新对象,没有就选出那个对象往数组后面添加东西,总的来看还是很复杂

          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
function arrayChange(array){ let idArray = [] let newArray = [] for (let index = 0; index < array.length; index++) { const element = array[index]; if (idArray.includes(element.id)) { let curEle = newArray.filter(item => item.id === element.id) curEle[0].spec.push(element.spec) } else { idArray.push(element.id) let obj = {} obj.id = element.id obj.spec = [] obj.spec.push(element.spec) newArray.push(obj) } } return newArray } console.log(arrayChange(array))

下面是V友给出的解答

          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
function arrayChange(array) { return array.reduce((total, prev) => { let item = total.find(item => item.id === prev.id) if (!item) { let ret = { id: prev.id, spec: [prev.spec] } total.push(ret) } else { item.spec.push(prev.spec) } return total }, []) }

此解法最佳

          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
function solution(arr) {   const table =new Map();   for (const {id, spec} of arr) {    if (!table.has(id)) table.set(id, []);    table.get(id).push(spec);  }   return [...table].map(([id, spec]) => ({id, spec})); } console.log(solution(array))

很显然自己的Js基础比较差,借此学习一下Map的用法

          
  • 1
  • 2
  • 3
  • 4
let myMap=new Map() myMap.set("a",1) myMap.set("b",2) console.log([...myMap]) //[ [ 'a', 1 ], [ 'b', 2 ] ]

MDN有比较详细的解释

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map

——THE END——
(完)
随便谈谈最近股市
全网都是AI了吧
一本书读懂财报--利润表
利润表解读
一本书读懂财报--资产负债表
股东权益=资产-负债
VSCode代码自动补全(html标签、style样式、css属性及值)
使用VSCode碰到.vue文件无法自动提示或补全style
webpack4.0基本的一些配置记录
再复习一遍总结了下,记是记不住了
谈谈公司和工作
纯吐槽,不宜观看
等待你的评论