Javascript 使用google apps脚本中的indexOf检查数组中的每个值是否与另一个数组中的任何值匹配
不知道我做错了什么Javascript 使用google apps脚本中的indexOf检查数组中的每个值是否与另一个数组中的任何值匹配,javascript,arrays,google-apps-script,indexof,Javascript,Arrays,Google Apps Script,Indexof,不知道我做错了什么 function ccheck(){ var tkhContacts = SpreadsheetApp.openById('##').getSheetByName('contacts'); var emf = ContactsApp.getContactGroup('emf').getContacts(); var fullNames = emf.map( function(contact){ return contact.getFullName() } );
function ccheck(){
var tkhContacts = SpreadsheetApp.openById('##').getSheetByName('contacts');
var emf = ContactsApp.getContactGroup('emf').getContacts();
var fullNames = emf.map( function(contact){ return contact.getFullName() } );
var tkhContacts = tkhContacts.getRange('B2:B').getValues();
for(var i=0;i<fullNames.length;i++){
if(fullNames[i].indexOf(tkhContacts) == -1){
Logger.log('missing')}
}
}
函数ccheck(){
var tkhContacts=SpreadsheetApp.openById('##').getSheetByName('contacts');
var emf=ContactsApp.getContactGroup('emf').getContacts();
var fullNames=emf.map(函数(contact){return contact.getFullName()});
var tkhContacts=tkhContacts.getRange('B2:B').getValues();
对于(var i=0;i我认为您使用了错误的indexOf方法。看起来您使用的是而不是
这应该适用于您的代码,但如果没有任何数据,则很难进行测试
const a = ['Sally', 'Walker', 'Claire', 'Lilly'];
const b = ['Kyle', 'Sally', 'Walker', 'Caroline', 'Claire'];
const d_hash = {};
const d_list = [];
a.forEach(a => {
const i = b.indexOf(a);
if (i === -1) {
// the name is missing
d_hash[a] = {
status: 'missing',
index: null
};
d_list.push(a);
} else {
// the name has been found
d_hash[a] = {
status: 'found',
index: i
}
}
});
console.log(d_hash);
console.log(d_list);
逻辑:
- 我有两个名称数组,array
a
和arrayb
。我想查找出现在a
中但不出现在b
中的名称
- 对于a的每个值,尝试在b中查找元素的索引。如果索引为-1,我们知道找不到元素
- 将结果存储为散列,并存储在数组中找不到的名称列表
或者
你真正想要做的是找出Seta
和Setb
的区别
我们可以将每个数组转换为一个集合,然后执行一个差分,以获得一个数组中出现的元素,而不是另一个数组中出现的元素
const a = ['Sally', 'Walker', 'Claire', 'Lilly'];
const b = ['Kyle', 'Sally', 'Walker', 'Caroline', 'Claire'];
const set_a = new Set(a);
const set_b = new Set(b);
// code adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
Set.prototype.diff = function (b) {
const d = new Set(a);
b.forEach(el => d.delete(el));
return d;
}
console.log(Array.from(set_a.diff(set_b))); // ["Lilly"]
澄清:
- 什么是forEach
For each是更新浏览器中Array.prototype上本机提供的方法
forEach应该应用于数组,该方法需要一个处理每个元素的函数回调
- 什么是
(…)=>{…}
这个箭头语法提供了另一种定义函数的方法(在我看来,更清晰、更清晰)
以前被表示为:
function (el) {
d.delete(el);
}
可以缩短为
(el) => d.delete(el);
b.forEach(el=>d.delete(el))中的el
是什么?`?很好的问题,为了让您理解这一点,请在阅读我的答案之前先看一下这两篇文章:现在我们知道forEach
需要函数回调作为参数,而ES6引入了箭头函数,一个短(和imo cleaner)函数语法。因此(el)=>d.delete(el));
相当于函数(el)=>{d.delete(el);}
啊,我明白了。不幸的是,Google apps脚本在很多ES6中都做得不好。您可以手动将其转换为旧语法,但从良好的代码角度来看,您可能应该对JS进行一般性的传输,对其进行精简。