您能否帮助我们将两个具有不同 struct 的不同数组中的数据组合起来?

我通过API获取数据,第一个请求是:

[
  {
    "category_id": "12345",
    "category_name": "itemgroup 1",
    "category_is_hidden": "0",
    "product_id": "9999999",
    "product_name": "item 1",
    "product_sku": "0002344",
    "product_brand": null,
    "product_vendor_code": "art 123",
    "is_productset": "0",
    "productset_items": null,
    "is_service": "0",
    "is_serial": "0",
    "variations": {
      "id": "1122334455",
      "name": "red",
      "measurement_unit": "unit_piece",
      "quantity_minimal_piece": "1.000",
      "sku": null,
      "vendor_code": "",
      "retail_price": "2550.00",
      "wholesale_price": "2550.00",
      "discount_type": "percent",
      "discount": "0.00",
      "barcodes": ["2000471000002", "2000481000009"]
    }
  }
]

第二个请求:

[
  {
    "9999999": {
      "company_id": 63,
      "branch_id": 69,
      "variation_id": 954629,
      "supplier_id": 0,
      "quantity": 1
    }
  }
]

我需要通过product_id匹配数据,并以以下格式获得输出: 产品名称、数量

在那一刻,我只想到了:

async function getstockandproductinfo() {
  try {
    const stockinforesponse = await axios.get(`${BASE_URL}/stock?branch_id=0`, {
      headers: {'API-KEY': API_KEY}
    });
    const productinforesponse = await axios.get (`${BASE_URL}/products`, {
      headers: {'API-KEY': API_KEY}
    });
    const productdata = productinforesponse.data;
    const stocksdata = stockinforesponse.data;
    const meld = [].concat(productdata, stocksdata);

    meld.forEach(item => {
      if (typeof item === 'object' && item !== null) {
        for (const product_id in item) {
          if (item[product_id] && item[product_id].hasOwnProperty('quantity')) {
            const quantity = item[product_id].quantity;
            console.log(`Product ID: ${product_id}, Quantity: ${quantity}`);
          }
        }
      }
    });

  } catch (error) {
    console.error('Error', error);
  }
}

getstockandproductinfo();

当我试图获取产品名称时,我得到了undefined

(我很乐意得到任何帮助,因为我是个彻头彻尾的菜鸟.

推荐答案

如果我理解正确的话,您想要与同一产品相关的combine个数据集.由于我不知道您稍后要对结果做什么,这里有两个产生不同数据 struct 的解决方案,每个解决方案在组合后更适合不同的用途.

以下字符组合成一个Array:

const DATA_REQUEST_A = [
  {
    "category_id": "12345",
    "category_name": "itemgroup 1",
    "category_is_hidden": "0",
    "product_id": "9999999",
    "product_name": "item 1",
    "product_sku": "0002344",
    "product_brand": null,
    "product_vendor_code": "art 123",
    "is_productset": "0",
    "productset_items": null,
    "is_service": "0",
    "is_serial": "0",
    "variations": {
      "id": "1122334455",
      "name": "red",
      "measurement_unit": "unit_piece",
      "quantity_minimal_piece": "1.000",
      "sku": null,
      "vendor_code": "",
      "retail_price": "2550.00",
      "wholesale_price": "2550.00",
      "discount_type": "percent",
      "discount": "0.00",
      "barcodes": ["2000471000002", "2000481000009"]
    }
  }
];

const DATA_REQUEST_B = [
  {
    "9999999": {
      "company_id": 63,
      "branch_id": 69,
      "variation_id": 954629,
      "supplier_id": 0,
      "quantity": 1
    }
  }
];

function merge(...objs) {
  return Object.assign({}, ...objs);
}

function combineByKey(dataA, dataB, keyA) {
  return dataA.reduce(
    (results, itemA) => {
      const matchBy = itemA[keyA];
      if (matchBy) {
        return dataB.reduce(
          (_results, itemB) => {
            const match = itemB[matchBy];
            if (match != null) {
              return _results.concat(merge(itemA, match));
            }
            return _results;
          },
          results
        );
      }
      return results;
    },
    []
  );
}

console.log(combineByKey(DATA_REQUEST_A, DATA_REQUEST_B, 'product_id'));

这给出了Array个相关产品的组合,这将使它很容易循环.如果你需要一种特定的产品,你必须通过雇佣.filter/.find来寻找它.

const combinations = combineByKey(DATA_REQUEST_A, DATA_REQUEST_B, 'product_id');
combinations.forEach(product => {
  console.log(product);
});

如果你只想在以后得到特定的产品,你可以将could组合成Object(或Map)而不是Array,以使查找更快:

const DATA_REQUEST_A = [
  {
    "category_id": "12345",
    "category_name": "itemgroup 1",
    "category_is_hidden": "0",
    "product_id": "9999999",
    "product_name": "item 1",
    "product_sku": "0002344",
    "product_brand": null,
    "product_vendor_code": "art 123",
    "is_productset": "0",
    "productset_items": null,
    "is_service": "0",
    "is_serial": "0",
    "variations": {
      "id": "1122334455",
      "name": "red",
      "measurement_unit": "unit_piece",
      "quantity_minimal_piece": "1.000",
      "sku": null,
      "vendor_code": "",
      "retail_price": "2550.00",
      "wholesale_price": "2550.00",
      "discount_type": "percent",
      "discount": "0.00",
      "barcodes": ["2000471000002", "2000481000009"]
    }
  }
];

const DATA_REQUEST_B = [
  {
    "9999999": {
      "company_id": 63,
      "branch_id": 69,
      "variation_id": 954629,
      "supplier_id": 0,
      "quantity": 1
    }
  }
];

function merge(...objs) {
  return Object.assign({}, ...objs);
}

function combineByKey(dataA, dataB, keyA) {
  return dataA.reduce(
    (results, itemA) => {
      const matchBy = itemA[keyA];
      if (matchBy) {
        return dataB.reduce(
          (_results, itemB) => {
            const match = itemB[matchBy];
            if (match != null) {
              return Object.assign(_results, {
                [matchBy]: merge(itemA, match)
              });
            }
            return _results;
          },
          results
        );
      }
      return results;
    },
    {} // <-- Using an object literal here
  );
}

console.log(combineByKey(DATA_REQUEST_A, DATA_REQUEST_B, 'product_id'));

这将使您能够根据其product_id的价值查找产品:

const combinations = combineByKey(DATA_REQUEST_A, DATA_REQUEST_B, 'product_id');
console.log(combinations[9999999]);

Javascript相关问答推荐

使用axios.获取实时服务器时的404响应

IMDB使用 puppeteer 加载更多按钮(nodejs)

Google Apps脚本中的discord邀请API响应的日期解析问题

colored颜色 检测JS,平均图像 colored颜色 检测JS

CheckBox作为Vue3中的一个组件

如何在JavaScript文件中使用Json文件

在使用HighChats时如何避免Datatables重新初始化错误?

Angular 中的类型错误上不存在获取属性

如何在ASP.NET JavaScript中使用Google Charts API仅对绘制为负方向的条形图移动堆叠条形图标签位置

如何在.NET Core中将chtml文件链接到Java脚本文件?

钛中的onClick事件需要在两次点击之间等待几秒钟

如何在DYGRAPS中更改鼠标事件和键盘输入

<;img>;标记无法呈现图像

将多个文本框中的输出合并到一个文本框中

使用RxJS from Event和@ViewChild vs KeyUp事件和RxJS主题更改输入字段值

如何在脚本编译后直接将RxJ模块导入浏览器(无需Angel、webpack、LiteServer)

在单击按钮时生成多个表单时的处理状态

固定动态、self 调整的优先级队列

如果查询为空,则MongoDB将所有文档与$in匹配

如何将缓冲区数组转换回音频