Node.js 如何按鞋码匹配合并重组StockX与GOAT的对象数组
同尺码跨平台数据合并实现方案
核心问题定位
当前实现的逻辑缺陷是没有建立尺码维度的关联关系:代码将StockX的返回结果先存入临时数组,拿到GOAT数据后直接向同一个数组末尾push独立的gSize/gPrice对象,最终数组自然会分裂为前后两段独立的、字段不统一的结构,无法匹配同一尺码下两个平台的价格信息。
实现步骤
- 统一两个平台的尺码格式:StockX返回的
xSize是字符串类型,GOAT返回的gSize是数字类型,直接匹配会因类型不一致导致匹配失效,需将尺码统一转为字符串作为关联键 - 分别为两个平台的价格数据建立尺码映射表:以规范后的尺码字符串为键,对应存储该尺码下的价格字段,查找某尺码对应价格的时间复杂度为O(1),比嵌套循环遍历效率更高
- 合并映射表生成最终结构:取两个平台所有尺码的去重集合,逐个从两个映射表中提取对应字段拼接为目标格式的对象,最后按尺码数值大小排序保证顺序一致
代码修改示例
直接修改原逻辑中getGoatAsk的实现,移除直接push到原stockx数组的错误逻辑,增加映射合并的流程,完全兼容原有接口调用链路:
function getGoatAsk(slug, photo, stockxData) { return new Promise((resolve, reject) => { request( { method: "GET", url: "https://www.goat.com/api/v1/product_variants?productTemplateId=" + slug, headers: goatGETHeaders, }, function (err, res, body) { if (err) return reject(err); const json = JSON.parse(body); const goatSizeMap = {}; // 1. 整理GOAT侧的尺码-价格映射 for (let variant of json) { // 保留原有筛选条件 if ( variant.shoeCondition === "new_no_defects" && variant.boxCondition === "good_condition" && variant.size >= 4 ) { const sizeKey = variant.size.toString(); // 统一转字符串做关联键 goatSizeMap[sizeKey] = { gSize: variant.size, gPrice: variant.lowestPriceCents.amount * 0.01 }; } } // 2. 整理StockX侧的尺码-价格映射 const stockxSizeMap = {}; stockxData.forEach(item => { const sizeKey = item.xSize.toString(); stockxSizeMap[sizeKey] = item; }); // 3. 收集两个平台的所有尺码去重列表 const allSizeKeys = new Set([ ...Object.keys(stockxSizeMap), ...Object.keys(goatSizeMap) ]); // 4. 按尺码拼接最终合并结构 const mergedList = Array.from(allSizeKeys).map(sizeKey => { const stockxInfo = stockxSizeMap[sizeKey] || {}; const goatInfo = goatSizeMap[sizeKey] || {}; return { xSize: stockxInfo.xSize ? Number(stockxInfo.xSize) : undefined, xPrice: stockxInfo.xPrice, gSize: goatInfo.gSize, gPrice: goatInfo.gPrice }; }); // 5. 按尺码从小到大排序,保证输出顺序符合预期 mergedList.sort((prev, next) => { const prevSize = Number(prev.xSize ?? prev.gSize); const nextSize = Number(next.xSize ?? next.gSize); return prevSize - nextSize; }); resolve(mergedList); } ); }); }
适配说明
- 完全兼容原有的接口请求逻辑,不需要修改
searchBrow函数里的StockX数据拉取流程,只要将原代码中push到stockx数组的GOAT数据逻辑移除,等所有GOAT数据整理完成后再执行合并即可 - 兼容单边数据缺口:如果某尺码仅在StockX在售、GOAT无对应报价,返回的对象中
gSize/gPrice字段会为undefined,不会出现代码报错 - 解决了之前字符串、数字类型尺码无法匹配的问题,比如StockX返回的
"4"和GOAT返回的4,会被识别为同一个尺码完成匹配
内容的提问来源于stack exchange,提问作者CF19S
相关产品推荐
相关产品推荐

