2017-05-08 65 views
0

我想整理一些对象看看喜欢这个排序对象通过按键使用lodash但键已经失去排序后

data = { 
     "imH3i4igFNxM3GL": { 
      "name": "Nacky", 
      "age": 12 
     }, 
     "vuzPuZUmyT8Z5nE": { 
      "name": "Emmy", 
      "age": 20 
     }, 
     "OkIPDY1nGjxlq3W": { 
      "name": "Nat", 
      "age": 20 
     } 
} 

我想通过“名”来排序。 我试图用Lodash解决这个问题。

_.sortBy(data, [function(o) { return o.name; }]); 

但是,这回我对象的数组没有钥匙

[ 
    { 
     "name": "Emmy", 
     "age": 20 
    }, 
    { 
     "name": "Nacky", 
     "age": 12 
    }, 
    { 
     "name": "Nat", 
     "age": 20 
    } 
] 

我想这回我排序的对象与喜欢同样

{ 
    "vuzPuZUmyT8Z5nE": { 
     "name": "Emmy", 
     "age": 20 
    }, 
    "imH3i4igFNxM3GL": { 
     "name": "Nacky", 
     "age": 12 
    }, 
    "OkIPDY1nGjxlq3W": { 
     "name": "Nat", 
     "age": 20 
    } 
} 

我应该怎么办键?谢谢

+0

你不是对数组排序;你正在尝试对一个对象进行排序。这通常是一个坏主意,因为对对象的迭代不能保证以你想要的顺序输出键[请参见类似问题的评论](http://stackoverflow.com/questions/1069666/sorting-javascript-对象属性值#comment67886877_1069666) –

+0

好吧,'_.sortBy'接受一个对象,但会按照文档返回一个数组。正如迈克所说,你无法用“排序”键获得对象。 –

回答

0

JS中的对象无法排序,属性的顺序也不可靠,即依赖于浏览器的实现。这就是为什么_.sortBy()正在将您的对象转换为排序数组。

我可以考虑2个选项来处理这个问题。

添加的关键对象数组

中如果你只需要在该对象的按键有序排列,这样就可以使一个列表。

var data = { 
 
     "imH3i4igFNxM3GL": { 
 
      "name": "Nacky", 
 
      "age": 12 
 
     }, 
 
     "vuzPuZUmyT8Z5nE": { 
 
      "name": "Emmy", 
 
      "age": 20 
 
     }, 
 
     "OkIPDY1nGjxlq3W": { 
 
      "name": "Nat", 
 
      "age": 20 
 
     } 
 
}; 
 

 
var result = _(data) 
 
    .map(function(v, k) { // insert the key into the object 
 
    return _.merge({}, v, { key: k }); 
 
    }) 
 
    .sortBy('name') // sort by name 
 
    .value(); 
 
    
 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

创建顺序排列

创建有序的按键阵列,而当你希望呈现在顺序对象使用它们。

var data = { 
 
     "imH3i4igFNxM3GL": { 
 
      "name": "Nacky", 
 
      "age": 12 
 
     }, 
 
     "vuzPuZUmyT8Z5nE": { 
 
      "name": "Emmy", 
 
      "age": 20 
 
     }, 
 
     "OkIPDY1nGjxlq3W": { 
 
      "name": "Nat", 
 
      "age": 20 
 
     } 
 
}; 
 

 
var orderArray = _(data) 
 
    .keys() // create an array of keys 
 
    .sortBy(function(key) { // sort the array using the original names 
 
    return data[key].name; 
 
    }) // sort by name 
 
    .value(); 
 

 
console.log('The order array', orderArray); 
 

 
console.log(orderArray.map(function(k) { 
 
    return data[k]; 
 
}));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>