使用动态键对数组中的对象进行排序

时间:2018-10-01 03:46:48

标签: javascript arrays angular typescript

我正在尝试根据对象中的属性对动态键/值(对象)数组进行排序。有人可以给我提供一个有关如何执行此操作的示例。我会尝试创建与我的问题类似的结构

订单分类:

export class order {
  id: number; 
  productRank: number; 
  productId: number; 
  productName: string;
}

在我的组件中有一个storeOrders可观察的订单数组

storeOrders$: Observable<Array<orders>>;

orders数组中的键是动态生成的,并与包含作为键的key / value和作为值的order对象一起存储

例如,orders对象类似于:

 let orders = {
12_123: { id: 123, productRank: 3, productId: 23, productName: 'shirt'},
23_124: { id: 124, productRank: 1, productId: 14, productName: 'cologne'},
67_124: { id: 125, productRank: 2, productId: 45, productName: 'belt' }       
 }

当我订阅此数据时,如何遍历storeOrders数组并根据productRank对项目进行排序。我一直在尝试解决这个问题,但无法正常工作,有人可以指出如何遍历数组中的动态键并基于值对象的属性进行排序吗?谢谢您的帮助,我们非常感谢!

2 个答案:

答案 0 :(得分:0)

您的订单应为以下对象,

orders = {
    12_123: { id: 123, productRank: 3, productId: 23, productName: 'shirt' },
    23_124: { id: 124, productRank: 1, productId: 14, productName: 'cologne' },
    67_124: { id: 125, productRank: 2, productId: 45, productName: 'belt' }
  };

您可以使用Object.values(orders)

来形成值

我使用lodash库中的sortBy,就像我习惯的那样,您将获得排序后的值

console.log(sortBy(Object.values(orders),['productRank']));

Stackblitz

答案 1 :(得分:0)

要订购键/值的动态数组,可以执行以下操作:

数组示例:

arr = [
{de : 'germany'},
{fr : 'france'},
{uk : 'united kingdom'},
{tn : 'tunisia'}
]

arr.sort((a, b) => {

      const a_key = Object.keys(a);
      const a_value = a[a_key];
      const b_key = Object.keys(b);
      const b_value = b[b_key];

      if (a_value == b_value) return 0;
      return a_value > b_value ? 1 : -1;
    });

仅此而已!