Сравните два массива и измените свойства соответственно

У меня есть два массива с именем prodArray и orderArray, как показано ниже.

prodArray = [
 {productId : 1 , productName: 'abc', checked: false},
 {productId : 2 , productName: 'def', checked: false},
 {productId : 3 , productName: 'ghi', checked: false},
 {productId : 4 , productName: 'jkl', checked: false}
]

orderArray = [
  {productId : 1 , productName: 'abc'},
  {productId : 4 , productName: 'jkl'}
]

Я хочу сравнить эти два и создать массив результатов, например следующий

resultArray = [
  {productId : 1 , productName: 'abc', checked: true},
  {productId : 2 , productName: 'def', checked: false},
  {productId : 3 , productName: 'ghi', checked: false},
  {productId : 4 , productName: 'jkl', checked: true}
]

То, что я пробовал до сих пор, выглядит следующим образом без везения

let resultArray = Array.from(new Set(prodArray .filter(f => {
                     return orderArray.some(o => {
                      return f.productId  === o.productId ;
                      });
                    }).filter(x => x.checked === true)));

Кто-нибудь может помочь? Спасибо :)

Поведение ключевого слова "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) для оценки ваших знаний,...
3
0
40
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать map() и find(). Ниже приведены шаги:

  • Применить map()prodArray
  • return объект со всеми предыдущими свойствами, но измените checked
  • Примените find() к orderArray и установите результат как свойство checked возвращаемого объекта из return.

let prodArray = [
 {productId : 1 , productName: 'abc', checked: false},
 {productId : 2 , productName: 'def', checked: false},
 {productId : 3 , productName: 'ghi', checked: false},
 {productId : 4 , productName: 'jkl', checked: false}
]

let orderArray = [
  {productId : 1 , productName: 'abc'},
  {productId : 4 , productName: 'jkl'}
]

let res = prodArray
               .map(x => ({...x,
                         checked:Boolean(orderArray.find(a => 
                            a.productId === x.productId && a.productName === x.productName))}
                ))

console.info(res)

@NabaragPaul Вы должны принять ответ, которым вы удовлетворены.

Maheer Ali 22.04.2019 09:41

Вы можете создать переменную new Set(), содержащую все productId. Используйте map, чтобы просмотреть каждый prodArray, и используйте проверку, есть ли в наборе productId

var prodArray = [{"productId":1,"productName":"abc","checked":false},{"productId":2,"productName":"def","checked":false},{"productId":3,"productName":"ghi","checked":false},{"productId":4,"productName":"jkl","checked":false}];
var orderArray = [{"productId":1,"productName":"abc"},{"productId":4,"productName":"jkl"}]

let productIDs = new Set(orderArray.map(o => o.productId));

let result = prodArray.map(o => ({ ...o,checked: productIDs.has(o.productId)}));

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

Вы можете взять Set и назначить новый объект для набора результатов.

var prodArray = [{ productId: 1 , productName: 'abc', checked: false }, { productId: 2 , productName: 'def', checked: false }, { productId: 3 , productName: 'ghi', checked: false }, { productId: 4 , productName: 'jkl', checked: false }],
    orderArray = [{ productId: 1 , productName: 'abc' }, { productId: 4 , productName: 'jkl' }],
    orders = new Set(orderArray.map(({ productId }) => productId)),
    result = prodArray.map(o => Object.assign({}, o, { checked: orders.has(o.productId) }));
  
console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

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