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
    和array
    b
    。我想查找出现在
    a
    中但不出现在
    b
    中的名称
  • 对于a的每个值,尝试在b中查找元素的索引。如果索引为-1,我们知道找不到元素
  • 将结果存储为散列,并存储在数组中找不到的名称列表
或者

你真正想要做的是找出Set
a
和Set
b
的区别

我们可以将每个数组转换为一个集合,然后执行一个差分,以获得一个数组中出现的元素,而不是另一个数组中出现的元素

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进行一般性的传输,对其进行精简。