首页 > 解决方案 > 比较两个数组并相应地更改属性

问题描述

我有两个名为 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)));

有人可以帮忙吗?谢谢 :)

标签: javascriptarraysarraylistfilter

解决方案


您可以使用map()find()。以下是步骤:

  • 应用map()_prodArray
  • return具有所有先前属性但更改checked
  • 应用find()并将orderArray结果设置为checked返回对象的属性。

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)


推荐阅读