Как отсортировать массив на основе свойства объекта в том же порядке, что и другое свойство объекта массива в node js - PullRequest
1 голос
/ 27 марта 2020

Ниже указан массив 1

[ { _id: 5e7bb66d99aa010ca9bfeed9,
messages: [ "A", "B", "C" ] },

{ _id: 5e7ba776c55fc40b216b0d12,
messages: [ "D" , "E", "F"] } ]

Ниже указан массив 2

[ { users: [ 'T' ],
ids: [ '5e79fdf9a783ce06caa6c7f8' ],
_id: 5e7ba776c55fc40b216b0d12,
time: 2020-03-25T22:42:54.017Z,
__v: 0 },


{ users: [ 'X' ],
ids: [ '5e76615566053a1613b61275' ],
_id: 5e7bb66d99aa010ca9bfeed9,
time: 2020-03-25T20:11:53.758Z,
__v: 0 } ]

Я хочу отсортировать массив Array1 на основе свойства _ray Array2. Например, я хочу, чтобы мой конечный результат выглядел следующим образом Для массива 1

{ _id: 5e7ba776c55fc40b216b0d12,
messages: [ "D" , "E", "F"] } ]

[ { _id: 5e7bb66d99aa010ca9bfeed9,
messages: [ "A", "B", "C" ] },

, в то время как массив Array2 будет выглядеть следующим образом:

 [ { users: [ 'T' ],
ids: [ '5e79fdf9a783ce06caa6c7f8' ],
_id: 5e7ba776c55fc40b216b0d12,
time: 2020-03-25T22:42:54.017Z,
__v: 0 },


{ users: [ 'X' ],
ids: [ '5e76615566053a1613b61275' ],
_id: 5e7bb66d99aa010ca9bfeed9,
time: 2020-03-25T20:11:53.758Z,
__v: 0 } ]

Я пытался сделать следующее, но это не не работает

 const test = Array1.sort(function(a,b){
        return Array2.indexOf(a._id) - Array2.indexOf(b._id)
 })

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Вы можете просто отобразить массив array2, чтобы получить список идентификаторов, а затем сравнить его порядок.

const arr1 = [ 
  { 
    _id: '5e7bb66d99aa010ca9bfeed9', 
    messages: [ "A", "B", "C" ] 
  },
  { 
    _id: '5e7ba776c55fc40b216b0d12', 
    messages: [ "D" , "E", "F"]
  }
];

const arr2 = [
  { 
    users: [ 'T' ], 
    ids: [ '5e79fdf9a783ce06caa6c7f8' ], 
    _id: '5e7ba776c55fc40b216b0d12', 
    time: '2020-03-25T22:42:54.017Z', 
    __v: 0
  },
  { users: [ 'X' ],
    ids: [ '5e76615566053a1613b61275' ],
    _id: '5e7bb66d99aa010ca9bfeed9',
    time: '2020-03-25T20:11:53.758Z',
    __v: 0
  }
];

const ids = arr2.map(item => item._id);
const result = arr1.sort((a, b) => ids.indexOf(a._id) - ids.indexOf(b._id));
console.log(result);
0 голосов
/ 27 марта 2020

Диагностика

Ваш код не работает, потому что вы пытаетесь найти _id внутри Array2, но массив не был структурирован так, как вы пытаетесь использовать.

Как это: Array[object{_id}]
То, как вы пытаетесь использовать: Array[_id]



Решение

Что вам нужно функция, которая находит объект внутри массива на основе его свойства _id и возвращает его индекс:

// You can create a new function to the Array class (Array.prototype)
// Returns the index of the element which _id equals myID
Array.prototype.indexOfMyID = function(myID){
    let index = this.findIndex(function(element){
        if(element._id === myID){
            return true;
        }
    });
    return index;
}

Теперь вы можете использовать эту функцию как встроенную функцию из класса Array

const test = Array1.sort(function(a, b){
    return Array2.indexOfMyID(a._id) - Array2.indexOfMyID(b._id);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...