Typescript - Как отсортировать один массив объектов на основе другого массива с полями отсортированного объекта? - PullRequest
0 голосов
/ 18 мая 2018

Typescript - Как отсортировать один массив объектов на основе другого массива с полями отсортированного объекта?

Например:

Массив A не отсортирован

Массив B с полем объектаsorted

Пытается отсортировать массив A на основе порядка массива B.

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"
}]

Массив отсортированного поля может быть любым, а не просто номером заказа, может быть символом, состоянием и т. д.Любое предложение ???

Посмотрел какой-то пример и попробовал несколько подходов, но пока нет элегантного решения с машинописью.Нет внешней библиотеки плз.

Ответы [ 4 ]

0 голосов
/ 18 мая 2018

Вы можете сделать это следующим образом: 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);
0 голосов
/ 18 мая 2018

Попробуйте следующее:

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);
0 голосов
/ 18 мая 2018

Если вы знаете поле, которое нужно отсортировать по нему, чтобы решение @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);
0 голосов
/ 18 мая 2018

Вы можете отсортировать массив, используя индекс 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...