Estoy tratando de hacer una aplicación simple para actualizar los precios en WooCommerce a través de la API REST.
Tengo arrayOne que tiene SKU + precios actualizados de mi ERP
[ {sku=PD-1000-B, price=9800.00}, {sku=PD-1007-A, price=9678.16} ]arrayTwo que tiene todos los productos de woocommerce, SKU, id (que necesito obtener) y el precio actual
[ {sku=PD-1000-B, id=1622.0, price=8145.9}, {sku=PD-1007-A, id=1624.0, price=9678.16} ]Me gustaría comparar arrayTwo con arrayOne, si el precio en arrayOne es mayor que con todas las coincidencias, combine y cree una nueva matriz. Algo como esto
[ {sku=PD-1000-B, id=1622.0, price=9800.00} ]Dado que el único precio más alto es para PD-1000-B.
Todo lo que obtuve hasta ahora es crear un nuevo conjunto, pero eso no compara nada, la idea sería reducir solo a cambios la cantidad a actualizar.
EDITAR: a partir de ahora, simplemente estoy reemplazando el precio en arrayTwo con el de arrayOne usando esto:
let set = new Set(); for (let i = 0; i < data.length; i++) set.add(data[i]['sku']) for (let i = 0; i < container.length; i++) if (set.has(container[i]['sku'])) container[i]['price'] = data[i]['price'];container es una variable vacía que estoy usando para recopilar los datos que obtengo de WooCommerce como una matriz y data es una matriz que contiene los precios actualizados + sku.
Gracias.
Puedes lograr esto en dos pasos:
arrOnearrTwoPuedes usar esta buena función para eso:
const arrOne = [ { sku: "PD-1000-B", price: 9678.16 }, { sku: "PD-1000-B", price: 9800.00 }, { sku: "PD-1007-C", price: 9714.16 }, { sku: "PD-1007-C", price: 9270.00 } ] const arrTwo = [ {sku: "PD-1000-B", id:1622.0, price:8145.9}, {sku: "PD-1007-A", id:1624.0, price:9678.16}, {sku: "PD-1007-C", id:1627.0, price:9478.16}, ] const findAllHighest = (arr) => { // 1) get highest one of each in arrOne const arrOneGreatest = arr.reduce((prev, cur) => { if(!prev[cur.sku]){ prev[cur.sku] = cur return prev } if(cur.price > prev[cur.sku].price){ prev[cur.sku] = cur } return prev }, {}) // match to arrayTwo const result = arrTwo.map(el => { const arrOneObj = Object.values(arrOneGreatest).find(n => n.sku === el.sku) if(!arrOneObj) return el if(arrOneObj.price > el.price) el.price = arrOneObj.price return el }, []) return result } console.log(findAllHighest(arrOne)) .as-console-wrapper { max-height: 100% !important; top: 0; }Yo lo intentaría de esta manera:
var arrayOne = [ {sku: 'PD-1000-B', price: 9800.00}, {sku: 'PD-1007-A', price: 9678.16} ]; var arrayTwo = [ {sku: 'PD-1000-B', id: 1622.0, price: 8145.9}, {sku: 'PD-1007-A', id: 1624.0, price: 9678.16} ]; // convert the array into the object {sku1: {}, sku2: {}, ...} var arrayOne_obj = {} for (let obj of arrayOne) arrayOne_obj[obj.sku] = {'price': obj.price}; // convert the array into the object {sku1: {}, sku2: {}, ...} var arrayTwo_obj = {} for (let obj of arrayTwo) arrayTwo_obj[obj.sku] = {'price': obj.price, 'id': obj.id}; // loop through the 'sku'-subobjects of the 'arrayOne_obj' object // compare its prices with prices of the same 'sku'-subobject of 'arrayTwo_obj', // and make the output array var output = []; for (let sku in arrayOne_obj) { let subObjOne = arrayOne_obj[sku]; let subObjTwo = arrayTwo_obj[sku]; if (subObjOne.price > subObjTwo.price) { output.push({'sku':sku, 'id': subObjTwo.id, 'price':subObjOne.price}); } } console.log(output); // output [ {sku: 'PD-1000-B', id:1622.0, price:9800.00} ] .as-console-wrapper { max-height: 100% !important; top: 0; }