以下例子是根据time属性把一维数组转为二维数组。
先定义一个数组:
const array = [
{
id: 123,
time: '2018-7',
name: 'aaa'
},
{
id: 123,
time: '2018-8',
name: 'aaa'
},
{
id: 123,
time: '2018-8',
name: 'aaa'
},
{
id: 123,
time: '2018-8',
name: 'aaa'
},
{
id: 123,
time: '2018-9',
name: 'aaa'
},
{
id: 123,
time: '2018-9',
name: 'aaa'
},
{
id: 123,
time: '2018-11',
name: 'aaa'
}
]
我的写法:
function translateArray(arr) {
let timeArr = []
let newArray = []
array.forEach(curArr => {
const index = timeArr.indexOf(curArr.time)
if (index > -1) {
newArray[index].push(curArr)
} else {
timeArr.push(curArr.time)
const length = newArray.length
newArray[length] = []
newArray[length].push(curArr)
}
})
return newArray
}
我的写法比较傻瓜式(`・ω・´),应该一看就懂了。
我们再来看看别人的写法:
function translateArray (array) {
let map1 = {}
while(array.length) {
let current = array.pop() // 会影响原数组
map1[current.time] = map1[current.time] || []
map1[current.time].push(current)
}
return Object.keys(map1).map(key => map1[key])
}
好像,,,一下子没看懂「(゚ペ),没关系,我们来慢慢理解:
其实主要是理解return那里做了什么事。首先,map1是一个对象,它的属性名就是我们的time(我的写法是把不同的时间存到一个数组中,判断数组中有没有这个值)。再看看return做了什么,Object.keys(map1)返回的是一个数组,数字的每一项是map1的属性,及这是一个time数组,遍历这个time数组,map中返回的就是相同时间的数组,最后我们就得到一个二维数组了。