Сравните два массива и измените свойства соответственно - PullRequest
3 голосов
/ 10 апреля 2019

У меня есть два массива с именами 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)));

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

Ответы [ 3 ]

3 голосов
/ 10 апреля 2019

Вы можете взять 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.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
3 голосов
/ 10 апреля 2019

Вы можете использовать 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.log(res)
1 голос
/ 10 апреля 2019

Вы можете создать переменную 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.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...