【发布时间】:2018-01-29 20:29:15
【问题描述】:
如何通过lodash将{2:'b',3:'c',1:'a'}转换成[{1:'a'},{2:'b'},{3:'c'}]?
【问题讨论】:
标签: javascript arrays sorting object lodash
如何通过lodash将{2:'b',3:'c',1:'a'}转换成[{1:'a'},{2:'b'},{3:'c'}]?
【问题讨论】:
标签: javascript arrays sorting object lodash
使用即将推出的带有 Object.entries 的 Javascript,您可以使用单个对象映射一个新数组。
var data = {2:'b',3:'c',1:'a'},
result = Object
.entries(data)
.sort((a, b) => a[0] - b[0])
.map(([k, v]) => ({ [k]: v }));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
使用 lodash,您可以使用
var data = {2:'b',3:'c',1:'a'},
result = _
.chain(data)
.toPairs(data)
.sortBy([0])
.map(o => _.fromPairs([o]));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
【讨论】:
使用Object.keys + Array.map 相当简单,你真的不需要lodash:
const obj = {2:'b',3:'c',1:'a'};
const arr = Object.keys(obj).map(key => ({ [key]: obj[key] }))
console.log(arr)
关于缺少sort 函数,上面的代码利用了数字索引的对象键(根据规范)顺序存储的事实。自己检查订单:
console.log({2:'b',3:'c',1:'a'})
这是the spec的相关部分
9.1.12 [[OwnPropertyKeys]] ( )
当调用 O 的 [[OwnPropertyKeys]] 内部方法时 采取以下步骤:
让键是一个新的空列表。
对于每个自己 O 的属性键 P 是一个整数索引,按升序排列 索引顺序
2a。添加 P 作为键的最后一个元素。
【讨论】:
Lodash 并不是真正需要完成你想要的,但我仍然在添加它并添加一个排序函数。我还包含了原生 JavaScript 方式。
const obj = {b: 3, c: 2, a: 1};
const sortByKeys = object => {
const keys = Object.keys(object)
const sortedKeys = _.sortBy(keys)
return _.map(sortedKeys, key => ({ [key]: object[key]}))
}
// the lodash way, and sorted
console.log(sortByKeys(obj))
// simpler way
const result = Object.keys(obj)
.map(key => ({ [key]: obj[key] }))
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
【讨论】:
为什么要使用 lodash?只需使用常规 Javascript。解决方案可以稍微清理一下,但想法是遍历您的对象并将您想要的格式推送到一个新数组中。为了方便起见,我也将排序放在那里,但请随意根据自己的喜好重新考虑。
const obj = {2:'b',3:'c',1:'a'}
let newArr = [];
for (var key in obj) {
newArr.push({[key]: obj[key]})
newArr.sort((a, b) => a[key] > b[key])
}
console.log(newArr)
【讨论】: