我有一个这样的对象数组
[{ ‘a’: { id: 4 }}, { ‘b’: { id: 3 }}, { ‘c’: { id: 2 }}, { ‘d’: { id: 5 }}]
我想用lodash知道根据id对对象的排序。我希望收到类似[‘d’, ‘a’, ‘b’, ‘c’]
的东西。
我试图进行搜索,但没有找到适用于每个对象中不同键的答案。我试图通过lodash的不同功能来做到这一点(很多)。因此,我认为解决这个问题可能是一种好方法,也可能是一种短方法。
答案 0 :(得分:4)
这是一个简单的JavaScript解决方案。
由于要获得排序后的键,因此,由于map
之前的第一个sort
,此解决方案不会修改原始数组:
const data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}];
const sorted = data
.map(x => Object.entries(x)[0])
.sort((a, b) => b[1].id - a[1].id)
.map(x => x[0]);
console.log(sorted);
如果您不希望更改原始数组,则可以直接使用Object.values()
进行排序,然后使用Object.keys()
返回第一个键:
const data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}];
const sorted = data
.sort((a, b) => Object.values(b)[0].id - Object.values(a)[0].id)
.map(x => Object.keys(x)[0]);
console.log(sorted);
答案 1 :(得分:3)
您可以通过使用sort
方法并在返回的数组上映射并返回键来简单地使用javascript
var data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]
const res = data.sort((a, b) => Object.values(b)[0].id - Object.values(a)[0].id).map(obj => Object.keys(obj)[0]);
console.log(res);
或者您可以将lodash与orderBy和map方法一起使用
var data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]
const res = _.orderBy(data, function(a) {
return Object.values(a)[0].id
}, ['desc']).map(o => Object.keys(o)[0])
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
答案 2 :(得分:1)
您可以先根据ID进行排序,然后再映射密钥。
let obj = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]
let op = obj
.sort((a,b) => Object.values(b)[0].id - Object.values(a)[0].id)
.map(e => Object.keys(e)[0])
console.log(op)
答案 3 :(得分:1)
这是lodash/fp的jo_va's solution版本。
使用_.flow()
创建一个将每个对象映射到[key, { id }]
对的函数。根据{{1}}用_.orderBy()
排序。迭代id
并解压缩_.map()
(密钥):
_.head()
const { flow, flatMap, toPairs, orderBy, map, head } = _
const fn = flow(
flatMap(toPairs), // convert each object to pair of [key, { id }]
orderBy(['[1].id'], ['desc']), // order descending by the id
map(head) // extract the original key
)
const data = [{ 'a': { id: 4 }}, { 'b': { id: 3 }}, { 'c': { id: 2 }}, { 'd': { id: 5 }}]
const result = fn(data)
console.log(result)
答案 4 :(得分:0)
const data = [{ a: { id: 4 }}, { b: { id: 3 }}, { c: { id: 2 }}, { d: { id: 5 }}];
data.sort((a, b) => Object.values(b)[0].id - Object.values(a)[0].id);
console.log(data);
上面的代码片段显示了如何使用Array.sort。罗珊(Lodash)的工作应该与此类似。