属性中对象的按自定义顺序排序

时间:2018-12-13 17:20:11

标签: javascript lodash

我需要通过子对象的属性对对象数组进行排序:

foo = [
  {
    bar: {
      order: "hello" 
    } 
  },
  {
    bar: {
      order: "something" 
    } 
  },
  {
    bar: {
      order: "else" 
    } 
  },
]

如果我希望foo对象的顺序基于由order值(如

)设置的自定义顺序(不是字母顺序!)

{ "something": 1, "hello": 2, "else": 3 }

使用_orderBy(foo, indexOfMyCustomOrder, 'desc')之类的东西,我该如何实现?还是我需要将此逻辑分为两个功能?

3 个答案:

答案 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

相关问题