微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Google App脚本中执行数组操作?

如何解决如何在Google App脚本中执行数组操作?

我是AppScript的新手,我完全不知道如何操作数组。我只希望能够采用一个数组并将公用元素折叠为一个单独的数组,如下所示;

groceryArray = [
                ["fruit","apple"],["fruit","banana"],["veg","potato"],"onion"],"broccoli"],]

并把它变成这个...

groceryArray2 = [
                  ["fruit",["apple","banana"]],["potato","onion","broccoli"]],]

我认为这很简单,但我根本无法解决...

解决方法

创建一个Mapreduce数组:

/*<ignore>*/console.config({maximize:true,timeStamps:false,autoScroll:false});/*</ignore>*/
const groceryArray = [
            ["fruit","apple"],["fruit","banana"],["veg","potato"],"onion"],"broccoli"],],collapsedMap = groceryArray.reduce((m,[category,item]) => m.set(category,m.has(category) ? m.get(category).concat(item):[item]),new Map),collapsedArray = [...collapsedMap];
console.info({collapsedMap,collapsedArray});
<!-- https://meta.stackoverflow.com/a/375985/ -->    <script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

,

您实际想要实现的是在每行的第一列上折叠一个网格。简而言之,这是一个非常简单的算法问题:

  1. 遍历网格行,对于每一行,检查属性是否存在并且是数组:

    1. 如果是,则将新项目推入数组。
    2. 如果否,则将该属性设置为具有一个当前项的数组。

TheMaster's answer演示了一种方法,下面是使用for...of,简单字典和Object.entries的另一种方法(它们都遵循相同的算法):

const groceryArray = [
  ["fruit",];

const fold = (grid,col = 0) => {

  const folded = {};

  for(const [ cat,item ] of grid) {
    const existing = folded[cat];
    
    if(existing) {
      existing.push(item);
      continue;
    }
    
    folded[cat] = [ item ];
  }
  
  return Object.entries(folded);
};

console.log( fold(groceryArray) );

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。