为什么这个映射函数不返回数字之一,当它从使用 GAS 中减去 1 时?
Why is this map function not returning one of the number, when it gets 1 to subtract from using GAS?
我正在获取列中的数字并从中减去 1,当值不为空时:
function myFunction(){
const ss = SpreadsheetApp.getActiveSpreadsheet();
const colSettingSheet = ss.getSheetByName('Settings');
let colSettings = colSettingSheet.getRange('D4:E').getValues();
let indexes = colSettings.map(e => e[1] > 0 ? e[1] - 1 : e[1]).filter(e => e != '');
}
原值:
[[6,7,8,1,,,,14,31,17,30,15,16,34]]
这是它返回的内容:
[5,6,7,13,30,16,29,14,15,33]
...它在 7
和 13
之间缺少一个 0
,我找不到原因。
感谢您的意见!
您需要过滤掉 undefined
,而不是空字符串。
正如 Alexey Zelenin 所建议的,filter
和 map
应该交换
let colSettings = [6,0,7,8,1,,,,14,31,17,30,15,16,34].map(a => [0,a]);
let indexes = colSettings.filter(e => e !== undefined).map(e => e[1] > 0 ? e[1] - 1 : e[1]);
console.log(indexes);
由于 filter
会自动删除空项,因此您可以改用 filter(Boolean)
。
[编辑]
你真的不需要用 filter
和 map
循环两次数组,你可以使用 reduce
并一次性过滤它:
let colSettings = [6,0,7,8,1,,,,14,31,17,30,15,16,34].map(a => [0,a]);
let indexes = colSettings.reduce((r,a) => ((r[r.length] = a[1] - (a[1] && 1)), r), []);
console.log(indexes);
P.S。
您的原始代码表明原始数组格式与您发布的不同,它更像是:
[[0,6],[0,7],[0,8],[0,1],,,,[0,14],[0,31],[0,17],[0,30],[0,15],[0,16],[0,34]]
如果数组实际采用您发布的格式 [[6,7,8,1,,,,14,31,17,30,15,16,34]]
,那么对应的代码将是:
let colSettings = [[6,0,7,8,1,,,,14,31,17,30,15,16,34]];
let indexes = colSettings.map(ar => ar.reduce((r,a) => ((r[r.length] = a - (a && 1)), r), []));
console.log(indexes);
这对我有用
function myFunction() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet1');
let s = sh.getRange('D4:E' + sh.getLastRow()).getValues();
Logger.log(s.map(e => e[1] > 0 ? e[1] - 1 : e[1]));
}
如果您只是首先使用 lastRow
消除空值,则不需要过滤器
我正在获取列中的数字并从中减去 1,当值不为空时:
function myFunction(){
const ss = SpreadsheetApp.getActiveSpreadsheet();
const colSettingSheet = ss.getSheetByName('Settings');
let colSettings = colSettingSheet.getRange('D4:E').getValues();
let indexes = colSettings.map(e => e[1] > 0 ? e[1] - 1 : e[1]).filter(e => e != '');
}
原值:
[[6,7,8,1,,,,14,31,17,30,15,16,34]]
这是它返回的内容:
[5,6,7,13,30,16,29,14,15,33]
...它在 7
和 13
之间缺少一个 0
,我找不到原因。
感谢您的意见!
您需要过滤掉 undefined
,而不是空字符串。
正如 Alexey Zelenin 所建议的,filter
和 map
应该交换
let colSettings = [6,0,7,8,1,,,,14,31,17,30,15,16,34].map(a => [0,a]);
let indexes = colSettings.filter(e => e !== undefined).map(e => e[1] > 0 ? e[1] - 1 : e[1]);
console.log(indexes);
filter
会自动删除空项,因此您可以改用 filter(Boolean)
。
[编辑]
你真的不需要用 filter
和 map
循环两次数组,你可以使用 reduce
并一次性过滤它:
let colSettings = [6,0,7,8,1,,,,14,31,17,30,15,16,34].map(a => [0,a]);
let indexes = colSettings.reduce((r,a) => ((r[r.length] = a[1] - (a[1] && 1)), r), []);
console.log(indexes);
P.S。
您的原始代码表明原始数组格式与您发布的不同,它更像是:
[[0,6],[0,7],[0,8],[0,1],,,,[0,14],[0,31],[0,17],[0,30],[0,15],[0,16],[0,34]]
如果数组实际采用您发布的格式 [[6,7,8,1,,,,14,31,17,30,15,16,34]]
,那么对应的代码将是:
let colSettings = [[6,0,7,8,1,,,,14,31,17,30,15,16,34]];
let indexes = colSettings.map(ar => ar.reduce((r,a) => ((r[r.length] = a - (a && 1)), r), []));
console.log(indexes);
这对我有用
function myFunction() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet1');
let s = sh.getRange('D4:E' + sh.getLastRow()).getValues();
Logger.log(s.map(e => e[1] > 0 ? e[1] - 1 : e[1]));
}
如果您只是首先使用 lastRow
消除空值,则不需要过滤器