【JS】根据数组对象的属性值把 一维数组转为二维数组

以下例子是根据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中返回的就是相同时间的数组,最后我们就得到一个二维数组了。

猜你喜欢

转载自blog.csdn.net/amyleeYMY/article/details/82591782