You need to enable JavaScript to run this app. Node.js 如何按鞋码匹配合并重组StockX与GOAT的对象数组
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 05:45:07