如何解决如何在Google App脚本中执行数组操作?
我是AppScript的新手,我完全不知道如何操作数组。我只希望能够采用一个数组并将公用元素折叠为一个单独的数组,如下所示;
groceryArray = [
["fruit","apple"],["fruit","banana"],["veg","potato"],"onion"],"broccoli"],]
并把它变成这个...
groceryArray2 = [
["fruit",["apple","banana"]],["potato","onion","broccoli"]],]
我认为这很简单,但我根本无法解决...
解决方法
/*<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>
,
您实际想要实现的是在每行的第一列上折叠一个网格。简而言之,这是一个非常简单的算法问题:
-
遍历网格行,对于每一行,检查属性是否存在并且是数组:
- 如果是,则将新项目推入数组。
- 如果否,则将该属性设置为具有一个当前项的数组。
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 举报,一经查实,本站将立刻删除。