繁体   English   中英

Typescript-如何根据具有已排序对象字段的另一个数组对一个对象数组进行排序?

[英]Typescript - How to sort one object array based on another array with sorted object's fields?

Typescript-如何根据具有已排序对象字段的另一个数组对一个对象数组进行排序?

例如:

阵列A未排序

数组B对象字段排序

尝试根据数组B的顺序对数组A进行排序。

const unsortedArray = [
{
    repId: "4",
    symbol: "MSLA",
    orderNo: "20180518-00004"
},
{
    repId: "2",
    symbol: "TSLA",
    orderNo: "20180518-00003"
},
{
    repId: "55",
    symbol: "APPL",
    orderNo: "20180518-00001"
},
{
    repId: "22",
    symbol: "FB",
    orderNo: "20180518-0002"
}]

const sortedArrayField = [
    "20180518-00001", 
    "20180518-00002", 
    "20180518-00003", 
    "20180518-00004"
]

// This is the sorted order that I want
const sortedArray = [
{
    repId: "55",
    symbol: "APPL",
    orderNo: "20180518-00001"
},
{
    repId: "22",
    symbol: "FB",
    orderNo: "20180518-00002"
},
{
    repId: "2",
    symbol: "TSLA",
    orderNo: "20180518-00003"
},
{
    repId: "4",
    symbol: "MSLA",
    orderNo: "20180518-00004"
}]

排序的字段数组可以是任何东西,而不仅是订单号,还可以是符号,状态等。

查找了一些示例并尝试了一些方法,但是到目前为止,对于打字稿,还没有很好的解决方案。 没有外部库plz。

您可以使用已排序数组中的orderNo索引对数组进行排序:

 const unsortedArray = [ { repId: "4", symbol: "MSLA", orderNo: "20180518-00004" }, { repId: "2", symbol: "TSLA", orderNo: "20180518-00003" }, { repId: "55", symbol: "APPL", orderNo: "20180518-00001" }, { repId: "22", symbol: "FB", orderNo: "20180518-00002" }] const sortedArrayField = [ "20180518-00001", "20180518-00002", "20180518-00003", "20180518-00004" ]; // Sort the array by index of orderNo in the sortedArray unsortedArray.sort((x, y) => sortedArrayField.indexOf(x.orderNo) - sortedArrayField.indexOf(y.orderNo) ); console.log(unsortedArray); 

如果您知道该字段,则需要根据该字段进行排序,因此@yadejo解决方案是正确的。

如果不这样做,请尝试以下解决方案

    const unsortedArray = [
  {
    repId: '4',
    symbol: 'MSLA',
    orderNo: '20180518-00004'
  },
  {
    repId: '2',
    symbol: 'TSLA',
    orderNo: '20180518-00003'
  },
  {
    repId: '55',
    symbol: 'APPL',
    orderNo: '20180518-00001'
  },
  {
    repId: '22',
    symbol: 'FB',
    orderNo: '20180518-00002'
  }];

const sortedArrayField = [
  '20180518-00001',
  '20180518-00002',
  '20180518-00003',
  '20180518-00004'
];

const sortedArrayOfObject = [];

for (const sortedItem of sortedArrayField) {
  sortedArrayOfObject.push(unsortedArray.find(item => {
    for (const prop in item) {
      if (item[prop] === sortedItem) {
        return true;
      }
    }
    return false;
  }));
}

console.log(sortedArrayOfObject);

尝试以下方法:

 const unsortedArray = [ { repId: "4", symbol: "MSLA", orderNo: "20180518-00004" }, { repId: "2", symbol: "TSLA", orderNo: "20180518-00003" }, { repId: "55", symbol: "APPL", orderNo: "20180518-00001" }, { repId: "22", symbol: "FB", orderNo: "20180518-00002" }]; const sortedArrayField = [ "20180518-00001", "20180518-00002", "20180518-00003", "20180518-00004" ]; unsortedArray.sort(function(obj1, obj2){ if(sortedArrayField.indexOf(obj1.orderNo) != -1 && sortedArrayField.indexOf(obj2.orderNo) != -1){ return sortedArrayField.indexOf(obj1.orderNo)- sortedArrayField.indexOf(obj2.orderNo); } else if(sortedArrayField.indexOf(obj1.orderNo) != -1 && sortedArrayField.indexOf(obj2.orderNo) == -1){ return 0; } else { return 1; } }); console.log(unsortedArray); 

您可以这样做: sortedArrayField.map(orderNo => unsortedArray.find(item => item.orderNo === orderNo))

如果在同一位置有多个对象,也可以使用此方法:

var sortedArray2 = [];
sortedArrayField.forEach(orderNo => {
  sortedArray2 = sortedArray2.concat(unsortedArray.filter(item => item.orderNo === orderNo));
});

 const unsortedArray = [ { repId: "4", symbol: "MSLA", orderNo: "20180518-00004" }, { repId: "2", symbol: "TSLA", orderNo: "20180518-00003" }, { repId: "55", symbol: "APPL", orderNo: "20180518-00001" }, { repId: "22", symbol: "FB", orderNo: "20180518-00002" }, { repId: "22 (2)", symbol: "FB", orderNo: "20180518-00002" }] const sortedArrayField = [ "20180518-00001", "20180518-00002", "20180518-00003", "20180518-00004" ]; var sortedArray = sortedArrayField.map(orderNo => unsortedArray.find(item => item.orderNo === orderNo)); console.log(sortedArray); var sortedArray2 = []; sortedArrayField.forEach(orderNo => { sortedArray2 = sortedArray2.concat(unsortedArray.filter(item => item.orderNo === orderNo)); }); console.log(sortedArray2); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM