我需要通过子对象的属性对对象数组进行排序:
foo = [
{
bar: {
order: "hello"
}
},
{
bar: {
order: "something"
}
},
{
bar: {
order: "else"
}
},
]
如果我希望foo
对象的顺序基于由order
值(如
{ "something": 1, "hello": 2, "else": 3 }
使用_orderBy(foo, indexOfMyCustomOrder, 'desc')
之类的东西,我该如何实现?还是我需要将此逻辑分为两个功能?
答案 0 :(得分:1)
定义indexOfMyCustomOrder
如下:
const indexOfMyCustomOrder = o => order[o.bar.order];
...,其中order
变量应该是为order
属性的每个可能值定义顺序的对象。
请参见摘要:
const foo = [{bar:{order:"hello"}},{bar:{order: "something"}},{bar:{order:"else"}}];
const order = { "something": 1, "hello": 2, "else": 3 };
const result = _.orderBy(foo, o => order[o.bar.order]);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>
答案 1 :(得分:1)
您可以这样做:
const foo = [{ bar: { order: "hello" } }, { bar: { order: "something" } }, { bar: { order: "else" } } ]
let order = { something: 0, hello: 1, ["else"]: 2 }
console.log(_.orderBy(foo, x => order[x.bar.order]))
console.log(_.orderBy(foo, x => order[x.bar.order], 'desc'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
通过index
映射定义订单的位置,并使用该位置过滤数据。
答案 2 :(得分:1)
您可以使用函数而无需lodash进行此操作,在该函数中,您可以获取自定义顺序的键,然后根据其值和模式(desc或asc)对它们进行排序,然后对其进行缩减,过滤要排序的数组每次元素。希望这会有所帮助。
a
aa
aaa
aaaa
aaaaa
aaaaaa
aaaaaaa
aaaaaaaa
aaaaaaaaa
aaaaaaaaaa