使用Object.keys和Array.reverse

时间:2017-08-10 10:40:19

标签: javascript ecmascript-6

我得到了以下对象

{
  "20170007": {
    "id": 1
  },
  "20170008": {
    "id" : 2
  },
  "20170009": {
   "id": 3
  },
  "20170010": {
    "id": 4
  }
}

期望的输出:

{
  "20170010": {
    "id": 4
  },
  "20170009": {
   "id": 3
  },
  "20170008": {
    "id" : 2
  },
  "20170007": {
    "id": 1
  }
}

我的尝试:

const obj = {
  "20170007": {
    "id": 1
  },
  "20170008": {
    "id" : 2
  },
  "20170009": {
   "id": 3
  },
  "20170010": {
    "id": 4
  }
}

const reverseObj = (obj) => {
  let newObj = {}

  Object.keys(obj)
    .sort()
    .reverse()
    .forEach((key) => {
      console.log(key)
      newObj[key] = obj[key]
    })

  console.log(newObj)
  return newObj  
}

reverseObj(obj)

奇怪的是,当我在console.log中输入forEach中的键时,键被反转。但是当我将键分配给newObj时,输出仍然是原始顺序... 什么事发生在这里?

编辑:

感谢所有回复,我看了一下Map对象。 Map

new Map([iterable])

实际上我正在寻找并且订单得到保证。

2 个答案:

答案 0 :(得分:2)

对象的元素没有订单

如果您希望他们有订单,您应该将元素存储在数组中。



const obj = {
  "20170007": {
    "id": 1
  },
  "20170008": {
    "id" : 2
  },
  "20170009": {
   "id": 3
  },
  "20170010": {
    "id": 4
  }
}

const arrayReverseObj = (obj) => {
  let newArray = []

  Object.keys(obj)
    .sort()
    .reverse()
    .forEach(key => {
      console.log(key)
      newArray.push( {
      'key':key, 
      'id':obj[key].id
      })
    })

  console.log(newArray)
  return newArray  
}

arrayReverseObj(obj)




结果类似于你想要的,但是是一个数组(这样元素可以有一个订单):

[{     " key":" 20170010",     " id":4   },   {     " key":" 20170009",     " id":3   },   {     " key":" 20170008",     " id":2   },   {     " key":" 20170007",     " id":1   }]

更简洁地说,我们可以在下面的评论中使用@torazaburo所指示的.map(),而不是完全镜像您的代码布局。一个例子是:

const arrayReverseObj = 
  (obj) => Object.keys(obj).sort().reverse().map(key=> ({key:key,id:obj[key].id}) );

答案 1 :(得分:1)

  

对象是Object类型的成员。 这是无序的   属性集合,每个属性包含一个原始值,   对象或功能。存储在对象属性中的函数是   称为方法。

ECMA specification

由于对象是无序的,您应该使用数组。