Как отсортировать массив по строковым значениям другого массива?

108
29 марта 2021, 07:10

Есть два массива объектов:

Первый массив:

[
    {id: "as3cdf114gte", name: "qwer", property: "1234"},
    {id: "e56cdf1fggte", name: "rqewrq", property: "4322"},
    {id: "as3trfgfi4ggf6", name: "qwerwq", property: "12342"}
]

Второй массив:

[
    {id: "e56cdf1fggte", data : 1},
    {id: "as3cdf114gte", data : 2},
    {id: "as3trfgfi4ggf6", data : 4}
]

Как отсортировать второй массив по значению полей id первого массива?

В итоге должно получиться:

[
    {id: "as3cdf114gte", data : 2},
    {id: "e56cdf1fggte", data : 1},
    {id: "as3trfgfi4ggf6", data : 4}
]
Answer 1

const first = [ 
  {id: "as3cdf114gte", name: "qwer", property: "1234"}, 
  {id: "e56cdf1fggte", name: "rqewrq", property: "4322"}, 
  {id: "as3trfgfi4ggf6", name: "qwerwq", property: "12342"} 
]; 
 
const second = [ 
  {id: "e56cdf1fggte", data : 1}, 
  {id: "as3cdf114gte", data : 2}, 
  {id: "as3trfgfi4ggf6", data : 4} 
]; 
 
// Формируем вспомогательный массив из `id` первого массива. 
const order = first.map(item => item.id); 
 
// Сортируем второй массив согласно индексам вспомогательного. 
second.sort((a, b) => order.indexOf(a.id) - order.indexOf(b.id)); 
 
console.log({ 
  first, 
  second 
})

Использованы материалы ответа на вопрос: Сортировка коллекции, где нужно переопределить размеры в нужном порядке

Answer 2

var a = [ 
    {id: "as3cdf114gte", name: "qwer", property: "1234"}, 
    {id: "e56cdf1fggte", name: "rqewrq", property: "4322"}, 
    {id: "as3trfgfi4ggf6", name: "qwerwq", property: "12342"} 
]; 
 
var b = [ 
    {id: "e56cdf1fggte", data : 1}, 
    {id: "as3cdf114gte", data : 2}, 
    {id: "as3trfgfi4ggf6", data : 4} 
]; 
 
var c = []; //resulting array 
 
var tindex = 0; 
 
for (i = 0; i < a.length; i++) { 
    c[i] = {}; 
    tindex = b.findIndex(x => x.id === a[i].id); 
    c[i].id = b[tindex].id; 
    c[i].data = b[tindex].data; 
} 
 
console.log(c);

Answer 3

Как уже писал в комментах к вопросу, сортировать смысла нет. надо взять "колонку" id из первого массива в нужном порядке, и составив словарик из второго сформировать результат. Если вы, конечно, опять что-нибудь не упустили в вопросе.

var a = [{id: "as3cdf114gte", name: "qwer", property: "1234"},{id: "e56cdf1fggte", name: "rqewrq", property: "4322"},{id: "as3trfgfi4ggf6", name: "qwerwq", property: "12342"}]; 
var b = [{id: "e56cdf1fggte", data : 1},{id: "as3cdf114gte", data : 2},{id: "as3trfgfi4ggf6", data : 4}]; 
 
var data = b.reduce( (acc, v) => ( acc[v.id] = v.data, acc) , {}); 
var result = a.map( v => ({ id: v.id, data: data[v.id] }) ); 
 
console.log(result);

READ ALSO
Модификация Iframe на php

Модификация Iframe на php

Есть задача модифицировать ютубовский плеерУ ютуба есть эмбендная ссылка такого типа - https://www

100
barode reader в режиме эмуляции клавиатуры

barode reader в режиме эмуляции клавиатуры

Задача стоит в том, чтобы понимать где ввод с клавиатуры в где с ридераПроблема: Разница между событиями keyup и keydown нам известна, но я не могу...

88
Получить угол поворота элемента jquery

Получить угол поворота элемента jquery

Задача такова есть div блок

110
Как показать что функция отсуствует потому что не имеет смысла, а не что ее забыли?

Как показать что функция отсуствует потому что не имеет смысла, а не что ее забыли?

В проекте есть семейство шаблонных функций которые принимают аргументы с некоторым ожидаемым интерфейсомПримерно так:

100