简体   繁体   中英

How to check if the variation combination already exists in Javascript?

Before registering Product Variations (myVariations), I need to check if variations already exist.

One : I want to register variation 2 and 6. I need to look in the allVariations array for this variation that contains the same product_detail_id

Two : 2 and 6 would return true because both belong to the same product_detail_id (3)

2 and 4 would return false because:

2 belongs to product_detail_id 1

4 belongs to product_detail_id 2

If possible, I want it to return true or false

In the example below, I have 2 and 6 in the myVariations variable, but it could be more than two variations.

  console.log(allVariations)
  console.log(myVariations)

/* CONSOLE */
[ RowDataPacket { product_detail_id: 1, variation_id: 2 },
  RowDataPacket { product_detail_id: 1, variation_id: 5 },
  RowDataPacket { product_detail_id: 2, variation_id: 4 },
  RowDataPacket { product_detail_id: 2, variation_id: 6 },
  RowDataPacket { product_detail_id: 3, variation_id: 2 },
  RowDataPacket { product_detail_id: 3, variation_id: 6 } ] // allVariations

[ { variation_id: 2 }, { variation_id: 6 } ] // myVariations

Took me a while, probably has a better way but this works as it supposed to:

Also works while for more than 2 elements

 const allVariations = [ { product_detail_id: 1, variation_id: 2 }, { product_detail_id: 1, variation_id: 5 }, { product_detail_id: 2, variation_id: 4 }, { product_detail_id: 2, variation_id: 6 }, { product_detail_id: 3, variation_id: 2 }, { product_detail_id: 3, variation_id: 6 }, { product_detail_id: 4, variation_id: 1 }, { product_detail_id: 4, variation_id: 2 }, { product_detail_id: 4, variation_id: 3 }, ]; const isContain = variation => !!variation.reduce((acc, my) => [...acc, allVariations.filter(all => my.variation_id === all.variation_id)], []) .reduce((acc, cur) => cur.find(e1 => acc && [acc].flat().some(e2 => e1.product_detail_id === e2.product_detail_id))); console.log(isContain([{ variation_id: 2 }, { variation_id: 6 }])); // true console.log(isContain([{ variation_id: 2 }, { variation_id: 4 }])); // false console.log(isContain([{ variation_id: 1 }, { variation_id: 2 }, { variation_id: 3 }])); // true

I would use 2 forEach loops:

 var all = [{ product_detail_id: 1, variation_id: 2 }, { product_detail_id: 1, variation_id: 5 }, { product_detail_id: 2, variation_id: 4 }, { product_detail_id: 2, variation_id: 6 }, { product_detail_id: 3, variation_id: 2 }, { product_detail_id: 3, variation_id: 6 }]; var myFalse = [{ variation_id: 2 }, { variation_id: 6 }, { variation_id: 7 }]; function hasAllVariations(allVariations, myVariations){ var r = [], l = myVariations.length, a = []; myVariations.forEach(function(o){ allVariations.forEach(function(q){ if(o.variation_id === q.variation_id)r.push(q); }); }); if(r.length < l){ return false; } r.forEach(function(o, k){ r.forEach(function(q, i){ if(k !== i && o.product_detail_id === q.product_detail_id && a.indexOf(k) === -1)a.push(k); }); }); return a.length >= l; } console.log(hasAllVariations(all, myFalse)); var myTrue = [{ variation_id: 2 }, { variation_id: 6 }]; console.log(hasAllVariations(all, myTrue)); console.log(hasAllVariations(all, [{ variation_id: 2 }, { variation_id: 4 }]));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM