сортировать массив объектов, используя другой массив - PullRequest
0 голосов
/ 30 сентября 2019

не удалось отсортировать объект массива в соответствии с заданным массивом. Помогите, пожалуйста, мне помочь !!

ссылка ссылка

const data = [ {
    parent_email: 'testuser@mailinator.com',
    childSurName: null,
    childFirstName: null,
    id: 22},
{
    parent_email: 'p20@mailinator.com',
    childSurName: null,
    childFirstName: 'Sachidanand',
    id: 31},
{
    parent_email: 'aa@aa.aaa',
    childSurName: null,
    childFirstName: null,
    id: 26}];

const order = [ 31,26 ];

const sorted = data.sort((a, b) => (
     order.indexOf(a.id)  - order.indexOf(b.id)
));

console.log(sorted)

Мне нужен отсортированный результат, как мойвторой массив, а затем после других данных:

 [ {
    parent_email: 'p20@mailinator.com',
    childSurName: null,
    childFirstName: 'Sachidanand',
    id: 31},
 {
    parent_email: 'aa@aa.aaa',
    childSurName: null,
    childFirstName: null,
    id: 26}
{
    parent_email: 'testuser@mailinator.com',
    childSurName: null,
    childFirstName: null,
    id: 22},
];

но я получаю ниже результат не получаю правильно отсортированные данные:

[{
    parent_email:"testuser@mailinator.com",
    childSurName:null,
    childFirstName:null,
    id:22
 },
 {
    parent_email:"p20@mailinator.com",
    childSurName:null,
    childFirstName:"Sachidanand",
    id:31
 },
 {
    parent_email:"aa@aa.aaa",
    childSurName:null,
    childFirstName:null,
    id:26
 }]

Ответы [ 3 ]

2 голосов
/ 30 сентября 2019

Вы можете использовать Map и place values along with priority внутри Карты, а затем сортировать,

Примечание: - Также не забудьте сохранить значение поиска и ключ того же типа

const data = [{parent_email: 'testuser@mailinator.com',childSurName: null,childFirstName: null,id: 22},{parent_email: 'p20@mailinator.com',childSurName: null,childFirstName: 'Sachidanand',id: 31},{parent_email: 'aa@aa.aaa',childSurName: null,childFirstName: null,id: 26}];

const order = ['31', '22'];
const mapper = new Map(order.map((v, i) => [parseInt(v), i + 1]))

const sorted = data.sort((a, b) => (
  (mapper.get(a.id) || Infinity) - (mapper.get(b.id) || Infinity)
));

console.log(sorted)
0 голосов
/ 30 сентября 2019

Проблема из-за идентификатора 22. Он не существует в массиве order и функция indexOf возвращает -1 для этого идентификатора. Это означает top priority, поэтому он появляется на первом месте массива результатов. Вы должны обрабатывать идентификаторы, которые не существуют в массиве order. Например (для сортировки) вы можете сделать следующее:

const sorted = data.sort((a, b) => {
    let aindex = order.indexOf(a.id);
    let bindex = order.indexOf(b.id);
    if(aindex === -1) return 1;
    if(bindex === -1) return -1;
    return aindex  - bindex;
});
0 голосов
/ 30 сентября 2019
const sorted = data.sort((a, b) => order.indexOf(a.id.toString()) - order.indexOf(b.id.toString()) );

id необходимо преобразовать toString.

В качестве альтернативы можно изменить

 const order = [ '31','22' ];

на

 const order = [ 31,22 ];
...