尝试根据子属性对对象键进行排序

时间:2018-09-12 18:46:53

标签: javascript lodash

我有这个对象:

var myObject = {
    cat: {
        order: 1
    },

    mouse: {
        order: 4
    },

    dog: {
        order: 2
    },   

    shark: {
        order: 3
    }
}

我正试图找回:["cat", "dog", "shark", "mouse"]

我尝试过:

_.sortBy(x, function(e) { return e.order} )

4 个答案:

答案 0 :(得分:7)

您可以简单地使用Object.keys()Array.sort()

  • 使用Object.keys()从对象中获取所有键。
  • 通过将自定义Comparator传递给sort函数来对所有键进行简单排序,该函数比较对象中键的order属性。

var myObject = { cat: { order: 1 }, mouse: { order: 4 }, dog: { order: 2 }, shark: { order: 3 } };

let result = Object.keys(myObject).sort((a,b)=> myObject[a].order -  myObject[b].order);

console.log(result);

答案 1 :(得分:5)

首先使用Object.entries,然后按其第二个元素的 order 属性进行排序(因为Object.entries返回给定对象自己的可枚举属性的数组> [键,值] ),最后使用Array.map来获取所需的内容。

var myObject = {
  cat: {
    order: 1
  },
  mouse: {
    order: 4
  },
  dog: {
    order: 2
  },
  shark: {
    order: 3
  }
}

console.log(
  Object.entries(myObject).sort((a, b) => {
    return a[1].order - b[1].order
  }).map(item => item[0])
)

答案 2 :(得分:0)

    var myObject = {
    cat: {
        order: 1
    },

    mouse: {
        order: 4
    },

    dog: {
        order: 2
    },   

    shark: {
        order: 3
    }
}     
let oKeys = Object.keys(myObject)

     let tempArray = []

     oKeys.forEach(function(key) {
        tempArray[myObject[key]['order']-1] = key
     })
          
   
     console.log(tempArray)

答案 3 :(得分:0)

这是使用lodash的解决方案。

使用_.map_.sort

  • 首先,从_.mapordername的数组。
  • 然后,_.sort_.map name

通过使用lodash链,使代码易于阅读。


 _(myObject)
   .map((v, k) => ({order: v.order, name: k}))
   .sortBy('order')
   .map('name')
   .value()