比较两个数组并相应地更改属性

时间:2019-04-10 14:04:20

标签: javascript arrays arraylist filter

我有两个名为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 个答案:

答案 0 :(得分:3)

您可以使用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)

答案 1 :(得分:3)

您可以使用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; }

答案 2 :(得分:1)

您可以创建一个包含所有new Set()的{​​{1}}变量。使用productId遍历每个map,并检查集合是否具有prodArray

productId