【问题标题】:Apps script: map not returning expected value to array应用程序脚本:映射未将预期值返回到数组
【发布时间】:2020-06-14 00:55:01
【问题描述】:

我有一个对象数组,看起来像:

var objArray = [
  {
    " #": "4596",
    " E": "Yes",
    " Date": "06/12/20",
    " County": "Los Angeles County",
    " State": "California",
    " Acres": "2.49",
    " Eager": "Low",
  },
  {
    " #": "4588",
    " E": "Yes",
    " Date": "06/11/20",
    " County": "Towns County",
    " State": "Georgia",
    " Acres": "3.00",
    " Eager": "High",
  },
  ....
];

我正在尝试将索引数组 ('#') 放在一起;

到目前为止我有:

let indexes = objArray.forEach(function (rowObj) {
  Object.keys(rowObj).map(function (key) {
    if (key.includes("#")) {
      var v = rowObj[key];
      Logger.log(v); // abc
      return v;
    }
  });
});

Logger.log(indexes); // abc

输出:

[20-06-13 20:43:33:320 EDT] 4547
[20-06-13 20:43:33:324 EDT] 4546
[20-06-13 20:43:33:329 EDT] 4545
[20-06-13 20:43:33:450 EDT] 4543
[20-06-13 20:43:33:453 EDT] 4542
[20-06-13 20:43:33:456 EDT] 4540
[20-06-13 20:43:33:459 EDT] 4538

这正在生产:

[20-06-13 20:43:33:462 EDT] null

我做错了什么?

【问题讨论】:

    标签: javascript arrays google-apps-script


    【解决方案1】:

    作为补充回答:

    您可以更简单、更快速地完成此操作。

    const values = [
      { " #": "4596", " E": "Yes"},
      { " #": "4597", " E": "No"},
      { " #": "4598", " E": "Maybe"},
    ]
    
    const indices = values.map(({ " #" : id }) => id);
    
    console.log(indices);

    请注意,对map() 方法的回调应该是确定性的,以获得一致的结果。

    实际问题

    查看有关 forEach() 方法的文档 - 它旨在产生副作用,因此返回 void(字面上没有值),因此是最后一个 Logger.log(indexes); 问题。

    有用的链接

    1. map() 方法reference
    2. 箭头函数guide
    3. forEach() 方法 reference

    【讨论】:

    • 这是个好主意,但是当我在应用程序脚本中运行它时,我得到: [null, null, null, null, null, null, null, null, null, null, null, null, null ,空,空,空,空,空,空,空,空,空,空,空,空]
    • # 在您的真实代码中是否以空格为前缀?你能说明你是如何实施这个建议的吗?
    • 您必须确保满足以下条件: 1. 直接在对象数组 (objArray) 上调用 map。 2. " #" 键完全由空格和哈希字符组成。 3. V8 运行时已启用(马里奥的答案也是如此,顺便说一句)
    【解决方案2】:

    如果您要查找的键始终是#,并且如果它存在于所有对象中,您可以使用reduce 简化逻辑。请看下面的例子

    const objArray = [
      {
        " #": "4596",
        " E": "Yes",
        " Date": "06/12/20",
        " County": "Los Angeles County",
        " State": "California",
        " Acres": "2.49",
        " Eager": "Low",
      },
      {
        " #": "4588",
        " E": "Yes",
        " Date": "06/11/20",
        " County": "Towns County",
        " State": "Georgia",
        " Acres": "3.00",
        " Eager": "High",
      },
    ];
    
    const output = objArray.reduce(
      (previousValue, currentValue) => [...previousValue, currentValue[" #"]],
      []
    );
    
    console.log(output)

    更新 0

    reduce 在需要压缩数组内容时使用它,它的操作与filtermap 非常相似,因为它们使用了一个回调函数,在数组的每个条目中执行,不同之处在于是它减少了您在每次迭代中更新的 initialValue 参数。

    例如,这是相同的版本,没有允许您使用箭头函数的快捷方式,previousValue 对应于初始值,currentValue 对应于每次迭代中的对象。所以在每次迭代中你spreadpreviousValue 的内容并获取并附加 currentValue 的# 属性的值

    运行示例,以便在每次迭代中查看 previousValue 的值

    const objArray = [
      {
        " #": "4596",
        " E": "Yes",
        " Date": "06/12/20",
        " County": "Los Angeles County",
        " State": "California",
        " Acres": "2.49",
        " Eager": "Low",
      },
      {
        " #": "4588",
        " E": "Yes",
        " Date": "06/11/20",
        " County": "Towns County",
        " State": "Georgia",
        " Acres": "3.00",
        " Eager": "High",
      },
    ];
    
    const output = objArray.reduce((previousValue, currentValue) => {
      console.log(previousValue);
      previousValue = [...previousValue, currentValue[" #"]];
    
      return previousValue;
    }, []);
    
    console.log(output);

    post 是我第一次读到关于 reduce 的内容,它以实用和简单的方式解释了这个概念。我推荐你阅读。干杯

    【讨论】:

    • 谢谢 - 我对 js 和 reduce 还很陌生。你介意解释一下你在这里做了什么吗?
    • 我很抱歉,这是一个很好的解释。我很熟悉并且以前使用过 reduce ,但在您的解释中处于初级阶段。我不太清楚您正在使用的函数 - (previousValue, currentValue) => [...previousValue, currentValue[" #"]] - 以前的值是累加器吗?
    • 我明白了。是的,previousValue 是累加器。关于[...previousValue, currentValue[" #"]]我正在使用扩展语法将当前累加器扩展为一个新数组加上属性`#`中的currentValue的值
    • @LDN - 自 ES6 出现以来,[...sourceArray, value] 只是一种更简洁的向右 sourceArray.concat([ value ]) 的方式(请参阅 spread in array literas
    【解决方案3】:

    我认为你在循环中间返回是问题所在。除此之外没关系。

    这对我有用:

    function functest() {
      var objArray =[{" #":"4596"," E":"Yes"," Date":"06/12/20"," County":"Los Angeles County"," State":"California"," Acres":"2.49"," Eager":"Low"},
                     {" #":"4588"," E":"Yes"," Date":"06/11/20"," County":"Towns County"," State":"Georgia"," Acres":"3.00"," Eager":"High"},
                     {" #":"4596"," E":"Yes"," Date":"06/12/20"," County":"Los Angeles County"," State":"California"," Acres":"2.49"," Eager":"Low"},
                     {" #":"4588"," E":"Yes"," Date":"06/11/20"," County":"Towns County"," State":"Georgia"," Acres":"3.00"," Eager":"High"},
                     {" #":"4596"," E":"Yes"," Date":"06/12/20"," County":"Los Angeles County"," State":"California"," Acres":"2.49"," Eager":"Low"},
                     {" #":"4588"," E":"Yes"," Date":"06/11/20"," County":"Towns County"," State":"Georgia"," Acres":"3.00"," Eager":"High"},
                     {" #":"4596"," E":"Yes"," Date":"06/12/20"," County":"Los Angeles County"," State":"California"," Acres":"2.49"," Eager":"Low"},
                     {" #":"4588"," E":"Yes"," Date":"06/11/20"," County":"Towns County"," State":"Georgia"," Acres":"3.00"," Eager":"High"}];
      var oA=[];
      let indexes=objArray.forEach(function(rowObj) {
        Object.keys(rowObj).map(function(key) {
          if (key.includes('#') ) {
            var v = rowObj[key];
            oA.push(v);
          }
        });
      });
      Logger.log(oA);
    }//[4596, 4588, 4596, 4588, 4596, 4588, 4596, 4588]
    

    【讨论】:

    • 我发现用它来查看结果要快得多:SpreadsheetApp.getUi().showModalDialog(HtmlService.createHtmlOutput(oA.join('<br />')), "Display Results");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2018-06-29
    相关资源
    最近更新 更多