【问题标题】:For loop not iterating a variableFor循环不迭代变量
【发布时间】:2022-01-23 22:30:13
【问题描述】:

我只是在学习 javascript,我正在尝试通过 GAS 更新 woocommerce 产品。

问题如下:

我有一个变量可以解析来自 woocommerce 的响应

for (let sku of skuSearch) {
    var surl = website + "/wp-json/wc/v3/products?consumer_key=" + ck + "&consumer_secret=" + cs + "&sku=" + sku;
    var url = surl
    Logger.log(url)

    var result = UrlFetchApp.fetch(url, optionsGet);
    if (result.getResponseCode() == 200) {

        var wooProducts = JSON.parse(result.getContentText());
        Logger.log(result.getContentText());

    }

然后我有另一个 for 进行迭代,并从一个新数组中进行迭代,该数组包含 wooProducts 的 id + sku 和来自另一个变量的价格,该变量从我的工作表中获取更新的价格:

var idLength = wooProducts.length;
    Logger.log(idLength);
    for (var i = 0; i < idLength; i++) {
        var container = [];
        Logger.log(i);
        container.push({
            id: wooProducts[i]["id"],
            sku: wooProducts[i]["sku"],
            price: data[i]["price"],
        });

我无法确切说明为什么它不起作用。我的意思是 for 循环有效,它在每个循环中推送 id、sku 和 price,只是 data[i] 只提供第一个 ¿object?而不是像 wooProducts 那样在每个循环中添加 +1 循环。

我将复制 3 个循环,这样就很清楚了,我不确定它是否已经清楚了。

循环 1:

[{"id":1622,"sku":"PD-1000-B","price":8145.9}]

循环 2:

[{"id":1624,"sku":"PD-1007-A","price":8145.9}]

循环 3:

[{"id":1625,"sku":"PD-1014","price":8145.9}]

您可以看到 id+sku 发生变化,但价格没有变化。

为了进一步了解,我将包含在 For 之外声明的数据变量:

const data = codigos.map(function(codigos, indice) {
    return {
        sku: codigos[0],
        price: precios[indice][0]
    }
})

//** 编辑:

我正在添加整个代码,这样可能更有意义?

function getDataloopwoo() {
var ck = 'xxx'

var cs = 'xxx'

var website = 'xxx'

var optionsGet =

    {
        "method": "GET",
        "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
        "muteHttpExceptions": true,

    };    

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('PreciosBULK');
var codigos = sheet.getRange("A2:A").getValues();
var precios = sheet.getRange("B2:B").getValues();
var skuSearch = sheet.getRange("A2:A").getValues();

const data = codigos.map(function(codigos, indice) {
    return {
        sku: codigos[0],
        price: precios[indice][0]
    }
})
Logger.log(skuSearch)

for (let sku of skuSearch) {
    var surl = website + "/wp-json/wc/v3/products?consumer_key=" + ck + "&consumer_secret=" + cs + "&sku=" + sku;
    var url = surl
    Logger.log(url)

    var result = UrlFetchApp.fetch(url, optionsGet);
    if (result.getResponseCode() == 200) {

        var wooProducts = JSON.parse(result.getContentText());
        Logger.log(result.getContentText());

    }
    var idLength = wooProducts.length;
    Logger.log(idLength);
    var container = [];
    for (var i = 0; i < idLength; i++) {            
        Logger.log(i);
        container.push({
            id: wooProducts[i]["id"],
            sku: wooProducts[i]["sku"],
            price: data[i]["price"],
        });
        
        Logger.log(container);
        var wooBatch = JSON.stringify(container);
        Logger.log(wooBatch);           
      }        
}

}

// 使用“解决”进行最终编辑:

所以我认为一次询问 1 个 sku 效率低下,所以现在我按 100 个询问,然后分页一段时间 if 并将 id、sku、价格保存到容器阵列。 我现在需要将容器数组与具有更新价格的数组进行比较,并形成一个具有 id、sku 和更新价格的新数组,我现在正在阅读。代码:

function getDataloopwoo() {
var ck = 'xx'

var cs = 'xx'

var website = 'xx'

var optionsGet =

    {
        "method": "GET",
        "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
        "muteHttpExceptions": true,

    };    

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('PreciosBULK');
var codigos = sheet.getRange("A2:A").getValues();
var precios = sheet.getRange("B2:B").getValues();    

const data = codigos.map(function(codigos, indice) {
    return {
        sku: codigos[0],
        price: precios[indice][0]
    }
})


var container = [];


    var surl = website + "/wp-json/wc/v3/products?consumer_key=" + ck + "&consumer_secret=" + cs + "&per_page=100";
    var url = surl
    //Logger.log(url)

    var result = UrlFetchApp.fetch(url, optionsGet);
    var headers = result.getAllHeaders();
    var total_pages = headers['x-wp-totalpages'];
    var pages_count = 0;
    while (pages_count < total_pages) {

    if (result.getResponseCode() == 200) {

        var wooProducts = JSON.parse(result.getContentText());
        //Logger.log(result.getContentText());
    }     
    
    
    for (var i = 0; i < wooProducts.length; i++) {            
        //Logger.log(i);
        container.push({
            id: wooProducts[i]["id"],
            sku: wooProducts[i]["sku"],
            price: wooProducts[i]["price"],
        });
        
        Logger.log(container);            
        
      }
      pages_count++;
      if (pages_count < total_pages){
        var surl = website + "/wp-json/wc/v3/products?consumer_key=" + ck + "&consumer_secret=" + cs + "&per_page=100" + "&page=" + (pages_count + 1);
        var url = surl
        var result = UrlFetchApp.fetch(url, optionsGet);
        Logger.log(url);
                    
      }        
}

}

【问题讨论】:

  • 变量skuSearch 是什么样的?尝试记录它。另外,请注意for ... infor ... of 之间的区别。见this
  • skuSearch 是一个仅检索 SKU 的简单对象。日志:[[PD-1000-B]、[PD-1007-A]、[PD-1014]、[PD-1026]]
  • the for of works as inteded(我认为),想法是循环 skuSearch 的值,以便将 sku 添加到 url。

标签: javascript arrays wordpress google-apps-script woocommerce


【解决方案1】:

您在循环的每次迭代中重置数组 container

for (var i = 0; i < idLength; i++) {
    var container = []; // <-----------------here
    ...
    container.push({
    ...

我认为数组应该定义在循环之外:

var container = [];
for (var i = 0; i < idLength; i++) {
    ...
    container.push({
    ...

【讨论】:

  • 谢谢!我会改变它。我不认为它可以解决数据问题吗?
  • 您的示例代码包含太多未知变量。您需要编写一段可重现的代码——所有变量都应该在代码中定义。实际上,一旦尝试制作可重现的示例,大多数错误就会消失。这是编码中最重要的技能之一。
  • 嗨,我刚刚添加了整个代码,看看是否有帮助。我还发布了一个示例电子表格,显然从 WooCommerce API 中删除了 CK、CS 变量,如果使用 Woo API 检查很重要,我可以将一些临时读取密钥提供给临时站点。
  • 嗨,恭喜你痊愈了!这项任务听起来并不是一项非常艰巨的任务。据我所知。但它变得相当复杂,因为它分布在几段代码和几个 cmets 上。如果您将其作为新问题发布会更好。只需显示您的两个数组(集合、对象)的样本和所需的输出,我相信您很快就会得到解决方案。它看起来像你的输入输出吗? pastebin.com/e0SQ60kB
  • 有点,它实际上是这样的:pastebin.com/LLvE9mwj 新数组只有更新的内容,如果价格不变,则不会出现在新数组中。我可以说我使用了错误的“stackoverflow.com/questions/70583634/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 2020-05-19
  • 2017-02-09
  • 1970-01-01
相关资源
最近更新 更多