比较两个数组中的一个值,如果较大,则复制+合并到第三个数组中



我正在尝试制作一个简单的应用程序,通过REST API更新WooCommerce中的价格。

我有arrayOne,它有SKU+从我的ERP 更新的价格

[
{sku=PD-1000-B, price=9800.00},
{sku=PD-1007-A, price=9678.16}
]

arrayTwo,它有来自woocommerce的所有产品,SKU,id(我需要得到(和当前价格

[
{sku=PD-1000-B, id=1622.0, price=8145.9},
{sku=PD-1007-A, id=1624.0, price=9678.16}
]

我想比较arrayTwo和arrayOne,如果arrayOne中的价格更大,那么在所有巧合的情况下组合并创建新的数组。像这样的

[
{sku=PD-1000-B, id=1622.0, price=9800.00}
]

因为唯一更大的价格是PD-1000-B。

到目前为止,我所得到的只是创建一个新的Set,但这并不能进行任何比较,我的想法是只减少要更新的数量。

编辑:到目前为止,我只是用arrayOne中的价格替换arrayTwo中的价格使用这个:

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是一个空变量,我用它来收集我从WooCommerce获得的数据,作为一个数组,data是一个包含更新价格+sku的数组。

谢谢。

您可以通过两个步骤实现这一点:

  1. arrOne中找到每一个中最伟大的
  2. arrTwo中对应的比较

你可以使用这个很好的功能:

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; }

我会这样尝试:

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; }

最新更新