比较两个数组并将对象添加到另一个数组中

3
我有两个数组:
let array1 = [
  {
    _id: '5eaf8eeac436dbc9b7d75f35',
    name: 'Strawberry',
    category: 'organic',
    image: '/productImages/australian.jpg',
    price: '9.65',
    quantity: 1
  },
  {
    _id: '5eaf8f61c436dbc9b7d75f36',
    name: 'Organic Wild Blue Berry',
    category: 'organic',
    image: '/productImages/owbb.jpg',
    price: '12.50',
    quantity: 1
  },
  {
    _id: '5eb0ac47d98c817d9a82df82',
    name: 'Mango',
    category: 'australian',
    image: '/productImages/australian.jpg',
    price: '12.25',
    quantity: 1
  },
  {
    _id: '5eb0ac71d98c817d9a82df83',
    name: 'Peas',
    category: 'conventional',
    image: '/productImages/owbb.jpg',
    price: '25.12',
    quantity: 1
  }
]

let array2 = [
  {
    _id: '5ec00539f7ff70566fd8a557',
    productid: {
      _id: '5eaf8eeac436dbc9b7d75f35',
      name: 'Strawberry',
      category: 'organic',
      image: '/productImages/australian.jpg',
      price: '9.65'
    },
    quantity: 3
  },
  {
    _id: '5ec00539f7ff70566fd8a558',
    productid: {
      _id: '5eaf8f61c436dbc9b7d75f36',
      name: 'Organic Wild Blue Berry',
      category: 'organic',
      image: '/productImages/owbb.jpg',
      price: '12.50'
    },
    quantity: 3
  }
]

我需要检查array2productId是否与array1中的任何一个_id相匹配。如果匹配,我需要将每个对象的数量加起来。否则,我需要把一个推到另一个里面。
例如,如果 "_id": "5eb0ac71d98c817d9a82df83"array2productId中不存在,请将其推入array2。如果array2中的任何元素在array1中不存在,请将其推入array1
我设法更新了一个数组中包含的对象的数量,但无法想出一种将其余对象推入彼此的方法。
以下是我如何将array1中匹配的_idarray2中的productId的数量相结合的方式:
if (array1.length > 0) {
  for (let i = 0; i < array2.length; i++) {
    for (let k = 0; k < array1.length; k++) {
      if (array2[i].productid._id === array1[k]._id) {
        array1[k].quantity = array1[k].quantity + array2[i].quantity
        array2[i].quantity = array1[k].quantity
      }
    }
  }
}

基于上面的示例,期望的结果是:

array1 = [
  {
    _id: '5eaf8eeac436dbc9b7d75f35',
    name: 'Strawberry',
    category: 'organic',
    image: '/productImages/australian.jpg',
    price: '9.65',
    quantity: 4
  },
  {
    _id: '5eaf8f61c436dbc9b7d75f36',
    name: 'Organic Wild Blue Berry',
    category: 'organic',
    image: '/productImages/owbb.jpg',
    price: '12.50',
    quantity: 4
  },
  {
    _id: '5eb0ac47d98c817d9a82df82',
    name: 'Mango',
    category: 'australian',
    image: '/productImages/australian.jpg',
    price: '12.25',
    quantity: 1
  },
  {
    _id: '5eb0ac71d98c817d9a82df83',
    name: 'Peas',
    category: 'conventional',
    image: '/productImages/owbb.jpg',
    price: '25.12',
    quantity: 1
  }
]

array2 = [
  {
    _id: '5ec00539f7ff70566fd8a557',
    productid: {
      _id: '5eaf8eeac436dbc9b7d75f35',
      name: 'Strawberry',
      category: 'organic',
      image: '/productImages/australian.jpg',
      price: '9.65'
    },
    quantity: 4
  },
  {
    _id: '5ec00539f7ff70566fd8a558',
    productid: {
      _id: '5eaf8f61c436dbc9b7d75f36',
      name: 'Organic Wild Blue Berry',
      category: 'organic',
      image: '/productImages/owbb.jpg',
      price: '12.50'
    },
    quantity: 4
  },
  {
    _id: 'auto-generated-id',
    productid: {
      _id: '5eb0ac47d98c817d9a82df82',
      name: 'Mango',
      category: 'australian',
      image: '/productImages/australian.jpg',
      price: '12.25'
    },
    quantity: 1
  },
  {
    _id: 'auto-generated-id',
    productid: {
      _id: '5eb0ac71d98c817d9a82df83',
      name: 'Peas',
      category: 'conventional',
      image: '/productImages/owbb.jpg',
      price: '25.12'
    },
    quantity: 1
  }
]

1
我认为@NinaScholz需要施展她的表格魔法 ;) - mplungjan
我会非常感激的,@NinaScholz。 - ertemishakk
如果它们相等,为什么最后需要两个数组? - Jonas Wilms
第二个数组来自数据库,我需要将本地存储和数据库更新为两者的组合。@JonasWilms - ertemishakk
3个回答

0

你可以使用 reduce 函数来实现这个功能。这是我的尝试:

var array1 =[{"_id":"5eaf8eeac436dbc9b7d75f35","name":"Strawberry","category":"organic","image":"/productImages/australian.jpg","price":"9.65","quantity":1},{"_id":"5eaf8f61c436dbc9b7d75f36","name":"Organic Wild Blue Berry","category":"organic","image":"/productImages/owbb.jpg","price":"12.50","quantity":1},{"_id":"5eb0ac47d98c817d9a82df82","name":"Mango","category":"australian","image":"/productImages/australian.jpg","price":"12.25","quantity":1},{"_id":"5eb0ac71d98c817d9a82df83","name":"Peas","category":"conventional","image":"/productImages/owbb.jpg","price":"25.12","quantity":1}];

var array2=[ { _id: '5ec00539f7ff70566fd8a557', productid: { _id: '5eaf8eeac436dbc9b7d75f35', name: 'Strawberry', category: 'organic', image: '/productImages/australian.jpg', price: '9.65', }, quantity: 3 }, { _id: '5ec00539f7ff70566fd8a558', productid: { _id: '5eaf8f61c436dbc9b7d75f36', name: 'Organic Wild Blue Berry', category: 'organic', image: '/productImages/owbb.jpg', price: '12.50', }, quantity: 3 }];


result = array1.reduce((acc, elem, i)=>{
    index = array2.findIndex(val=>val.productid._id == elem._id);
 if(index!=-1) {
  array2[index].quantity = elem.quantity += array2[index].quantity;
 } else {
   array2.push({_id:'some_id'+i, productid: elem, quantity: elem.quantity})
 }
    acc.push(elem);
 return acc;
},[]);

result = [...result, ...array2.filter(elem=> !array1.some(val=>val._id == elem.productid._id)).map(({productid, quantity})=>({...productid, quantity}))];


console.log(result);
console.log(array2)


非常感谢。 - ertemishakk
@ertemishakk 我很高兴能够帮到您。 - gorak
如何添加选项以检查array1是否为空或不包含来自array2的任何对象,如果是,则将array2对象推入array1,就像上面的那个一样,反之亦然。刚意识到当array1为空或不包含来自array2的任何对象时它不起作用。 - ertemishakk
非常感谢您的帮助,还有一件事,您过滤和映射存在于数组2中的对象并将其推入数组1,一切都很顺利,除了在这样做时,您忘记了数量,您能否再次为我更新它。谢谢! - ertemishakk
@ertemishakk,我更新了我的回答,请看一下。 - gorak
非常感谢,我已经整天都在努力工作了。谢谢。 - ertemishakk

0
你可以使用哈希表来处理第二个数组,然后遍历第一个数组,推入新的数据集并更新值。

let array1 = [{ _id: "5eaf8eeac436dbc9b7d75f35", name: "Strawberry", category: "organic", image: "/productImages/australian.jpg", price: "9.65", quantity: 1 }, { _id: "5eaf8f61c436dbc9b7d75f36", name: "Organic Wild Blue Berry", category: "organic", image: "/productImages/owbb.jpg", price: "12.50", quantity: 1 }, { _id: "5eb0ac47d98c817d9a82df82", name: "Mango", category: "australian", image: "/productImages/australian.jpg", price: "12.25", quantity: 1 }, { _id: "5eb0ac71d98c817d9a82df83", name: "Peas", category: "conventional", image: "/productImages/owbb.jpg", price: "25.12", quantity: 1 }],
    array2 = [{ _id: '5ec00539f7ff70566fd8a557', productid: { _id: '5eaf8eeac436dbc9b7d75f35', name: 'Strawberry', category: 'organic', image: '/productImages/australian.jpg', price: '9.65', }, quantity: 3 }, { _id: '5ec00539f7ff70566fd8a558', productid: { _id: '5eaf8f61c436dbc9b7d75f36', name: 'Organic Wild Blue Berry', category: 'organic', image: '/productImages/owbb.jpg', price: '12.50', }, quantity: 3 }],
    ids = array2.reduce((r, o) => {
        r[o.productid._id] = o; return r;
    }, {}),
    result = array1.forEach(o => {
        if (ids[o._id]) {
            const value = o.quantity;
            o.quantity += ids[o._id].quantity;
            ids[o._id].quantity += value;
        } else {
            const { quantity, ...productid } = o;
            array2.push(ids[productid._id] = { _id: 'auto-generated-id', productid, quantity });
        }
    });

   console.log(array1);
   console.log(array2);
.as-console-wrapper { max-height: 100% !important; top: 0; }


0
我会将第一个数组的数量添加到第二个数组中,然后根据第一个数组重新生成第二个数组:
  // Create a lookup table to make the whole thing O(n)
  const entryById = {};
  for(const item of array2)
    entryById[item.productid._id] = item;

  // Update array2 with the amount of array1
  for(const item of array1) {
    if(entryById[item]) {
       entryById[item].amount += item.amount;
    } else {
       array2.push(entryById[item] = {
         _id: 'generated',
         productid: item,
         amount: item.amount,
      });
    }
  }

 // Regenerate array1
 array1 = array2.map(({ productid, amount }) => ({ ...productid, amount }));

我觉得奇怪的是你在这里维护了两个不同的数据结构。


非常感谢。MongoDB 为我添加到 array2 中的每个项目生成 _id,除了 productid。 - ertemishakk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接