Сравните два списка, чтобы отсортировать второй список

Я хотел бы сравнить два списка, если значение первого списка соответствует коду второго списка, необходимо, чтобы второй список был отсортирован по сравниваемым значениям

Первый список:

      var List1 = [{id : "idValue2"}, {id : "idValue5"}]

Второй список (до сортировки)

     var List2 = [
                  {code : "idValue1", label: "value1"}, 
                  {code : "idValue2", label: "value2"},
                  {code : "idValue3", label: "value3"},
                  {code : "idValue4", label: "value4"};
                  {code : "idValue5", label: "value5"}]

После сравнения идентификаторов списка 1 и кодов списка 2 будет отсортирован список 2.

Второй список (после сортировки)

     var List2 = [
                  {code : "idValue2", label: "value2"},
                  {code : "idValue5", label: "value5"}
                  {code : "idValue1", label: "value1"}, 
                  {code : "idValue3", label: "value3"},
                  {code : "idValue4", label: "value4"}]

Здесь idValue2 и idValue5 занимают первые места.

У тебя есть решение ?

Возможный дубликат Javascript - массив сортировки на основе другого массива

Björn Böing 28.05.2019 13:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
186
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это простое, но, возможно, не очень эффективное решение. По сути, у вас есть два вложенных цикла for, которые проходят через List1 и List2. Если идентификатор и код совпадают, элемент List2 помещается в массив результатов, а из копии List2 этот элемент удаляется. Почему копия? Таким образом, мы не изменяем List2 во время его повторения. В итоге результат (отсортированные элементы) и copyList2 (оставшиеся, не отсортированные элементы) объединяются с помощью concat.

var List1 = [{id : "idValue2"}, {id : "idValue5"}]

var List2 = [
   {code : "idValue1", label: "value1"}, 
   {code : "idValue2", label: "value2"},
   {code : "idValue3", label: "value3"},
   {code : "idValue4", label: "value4"},
   {code : "idValue5", label: "value5"}
]

var result = [];
var copyList2 = List2;

for(var i = 0; i < List1.length; i++){
  for(var j = 0; j < List2.length; j++){
   if (List1[i].id === List2[j].code){
     result.push(List2[j]);
     copyList2.splice(j, 1);
   }
  }
}

result = result.concat(copyList2);
console.info(result);

Вы можете хранить идентификаторы во временном массиве как значения. Затем используйте пользовательскую функцию сортировки в массиве list2, чтобы сравнить позиции кода во временном массиве:

let list1 = [{id : "idValue2"}, {id : "idValue5"}];
let list2 = [
  {code : "idValue1", label: "value1"}, 
  {code : "idValue2", label: "value2"},
  {code : "idValue3", label: "value3"},
  {code : "idValue4", label: "value4"},
  {code : "idValue5", label: "value5"}
];

let tempArray = [];
for (let obj of list1) {
  tempArray.push(obj.id);
}

list2.sort(function(a, b) {
  let iA = tempArray.indexOf(a.code);
  let iB = tempArray.indexOf(b.code);
  if (iA == iB) {
      return 0;
  }
  if (iA == -1) {
    return 1;
  }
  if (iB == -1) {
    return -1;
  }
  if (iA < iB) {
    return -1;
  }
  if (iA > iB) {
    return 1;
  }
});


console.info(list2);
Ответ принят как подходящий

Попробуйте так. просто filter и some дадут вам нужные массивы, наконец, объединят оба массива

var List1 = [{id : "idValue2"}, {id : "idValue5"}]

var List2 = [
   {code : "idValue1", label: "value1"}, 
   {code : "idValue2", label: "value2"},
   {code : "idValue3", label: "value3"},
   {code : "idValue4", label: "value4"},
   {code : "idValue5", label: "value5"}
]

var a = List2.filter(x=> ( List1.some(y=> { return y.id == x.code }) ));

var b = List2.filter(x=> ( !List1.some(y=> { return y.id == x.code }) ))


var list3 = a.concat(b);

console.info(list3);

Другие вопросы по теме