在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ js 數(shù)組解析成多維?

js 數(shù)組解析成多維?

前提

做前后端分離,現(xiàn)有如下數(shù)組按照updated_at倒序,根據(jù)year做第一級,month做第二級,拼裝成多維數(shù)組,原先是在php后端進行排序處理,但是通過json傳遞到前端變成無序,現(xiàn)在想通過js,該如何處理?

[
    {
        "id": 15,
        "year": "2018",
        "month": "03",
        "updated_at": "2018-03-01 15:09:59"
    },
    {
        "id": 14,
        "year": "2018",
        "month": "02",
        "updated_at": "2018-02-24 21:39:53"
    },
    {
        "id": 13,
        "year": "2017",
        "month": "12",
        "updated_at": "2017-12-02 16:45:03"
    },
    {
        "id": 5,
        "year": "2017",
        "month": "11",
        "updated_at": "2017-11-10 17:32:11"
    },
    {
        "id": 7,
        "year": "2017",
        "month": "11",
        "updated_at": "2017-11-07 17:26:09"
    },
    {
        "id": 9,
        "year": "2017",
        "month": "10",
        "updated_at": "2017-10-23 19:08:12"
    },
    {
        "id": 8,
        "year": "2017",
        "month": "10",
        "updated_at": "2017-10-20 20:13:07"
    },
    {
        "id": 10,
        "year": "2017",
        "month": "09",
        "updated_at": "2017-09-23 19:05:52"
    },
    {
        "id": 4,
        "year": "2017",
        "month": "09",
        "updated_at": "2017-09-18 17:32:49"
    },
    {
        "id": 3,
        "year": "2017",
        "month": "07",
        "updated_at": "2017-07-22 17:34:20"
    },
    {
        "id": 6,
        "year": "2017",
        "month": "07",
        "updated_at": "2017-07-02 17:28:49"
    },
    {
        "id": 12,
        "year": "2017",
        "month": "06",
        "updated_at": "2017-06-15 15:31:18"
    },
    {
        "id": 11,
        "year": "2017",
        "month": "06",
        "updated_at": "2017-06-11 15:32:16"
    }
]

期望所得數(shù)據(jù)如下

    "2018": {
        "03": [{
            "id": 15,
            "updated_at": "2018-03-01"
        }],
        "02": [{
            "id": 14,
            "updated_at": "2018-02-24"
        }]
    },
    "2017": {
        "12": [{
            "id": 13,
            "updated_at": "2017-12-02"
        }],
        "11": [{
            "id": 5,
            "updated_at": "2017-11-10"
        }, {
            "id": 7,
            "updated_at": "2017-11-07"
        }],
        "10": [{
            "id": 9,
            "updated_at": "2017-10-23"
        }, {
            "id": 8,
            "updated_at": "2017-10-20"
        }],
        "09": [{
            "id": 10,
            "updated_at": "2017-09-23"
        }, {
            "id": 4,
            "updated_at": "2017-09-18"
        }],
        "07": [{
            "id": 3,
            "updated_at": "2017-07-22"
        }, {
            "id": 6,
            "updated_at": "2017-07-02"
        }],
        "06": [{
            "id": 12,
            "updated_at": "2017-06-15"
        }, {
            "id": 11,
            "updated_at": "2017-06-11"
        }]
    }
}
回答
編輯回答
野橘

請補充說明期望的結果(給出例子)

更新

首先,JS 對象中的鍵是不保證順序的

也就是說:

let years = {}
years['2018'] = 'haha'
years['2017'] = 'heihei'
console.log(Object.keys(years)) // 不保證是 ['2018', '2017'],有可能是 ['2017', '2018']
console.log(years) // 不保證是 {2018: 'haha', 2017: 'heihei'},有可能是 {2017: 'heihei', 2018: 'haha'}

在此基礎之上,如果仍要做的話,可以按照以下步驟:

將原數(shù)組按照 year->month 的順序排序

  • 如果 year month 正是 updated_at 中的年月的話,按照 updated_at 倒序其實就已經(jīng)按照 year->month 排好了
  • 如果不是的話,手動排一下:
data.sort(function (d1, d2) => {
  if (d1.year > d2.year) return -1
  if (d1.year < d2.year) return 1
  return (+d2.month) - (+d1.month)
})

此時遍歷 data 即可

let years = {}
data.forEach(function (d) => {
  if (!years[d.year]) years[d.year] = {}
  let thisYear = years[d.year]
  if (!thisYear[d.month]) thisYear[d.month] = []
  thisYear[d.month].push({
    id: d.id,
    updated_at: d.updated_at
  })
})
consol.log(years) // 就是你要的結果了

整理下代碼:

const result = data
  .sort((d1, d2) => {
    if (d1.year > d2.year) return -1
    if (d1.year < d2.year) return 1
    return (+d2.month) - (+d1.month)
  })
  .reduce((years, {id, year, month, updated_at}) => {
    const thisYear = (years[year] = years[year] || {})
    const thisMonth = (thisYear[month] = thisYear[month] || [])
    thisMonth.push({id, updated_at})
    return acc
  }, {})

如果一定要保證鍵的順序的話,可以使用 Map它是保證順序的

const result = data
  .sort((d1, d2) => {
    if (d1.year > d2.year) return -1
    if (d1.year < d2.year) return 1
    return (+d2.month) - (+d1.month)
  })
  .reduce((years, {id, year, month, updated_at}) => {
    if (!years.has(year)) years.set(year, new Map())
    const thisYear = years.get(year)
    if (!thisYear.has(month)) thisYear.set(month, [])
    const thisMonth = thisYear.get(month)
    thisMonth.push({id, updated_at})
    return acc
  }, new Map())

希望對你有幫助

2018年7月18日 04:48
編輯回答
別瞎鬧
data.sort((a,b)=>b.updated_at.replace(/[-\s:]/g,"")-a.updated_at.replace(/[-\s:]/g,""));
var arr = {};
//data.map((item)=>{
//    arr[item.year]?arr[item.year].push(item):arr[item.year]=[item]
//})
//修改
data.map((item)=>{
    if(!arr[item.year]){
        arr[item.year]={}
    }
    arr[item.year][item.month]?arr[item.year][item.month].push(item):arr[item.year][item.month]=[item]
})
2017年5月19日 15:08