使用google apps脚本中的indexOf检查数组中的每个值是否与另一个数组中的任何值匹配

时间:2017-09-18 21:54:40

标签: 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() } );
  var tkhContacts = tkhContacts.getRange('B2:B').getValues();

   for(var i=0;i<fullNames.length;i++){
         if(fullNames[i].indexOf(tkhContacts) == -1){
       Logger.log('missing')}
     }
   }

尝试将所有Google联系人放入群组&#em;&#39;成阵列。然后将表中存储在B列中的联系人名称放入一个数组中。然后在&#39; fullNames&#39;中取出每个名字。数组并检查它是否与&t; tkhContacts&#39;中的任何名称相匹配。从表格。如果姓名在&#39; fullNames&#39;不符合&t; tkhContacts&#39;中的任何名称将值设置为false。

1 个答案:

答案 0 :(得分:0)

我认为您使用的是错误的indexOf方法。看起来您使用的是String.prototype.indexOf()而不是Array.prototype.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);

逻辑:

  • 我有两个名字数组,数组a和数组b。我想找到a但不在b中显示的名称。
  • 对于a的每个值,尝试在b中查找元素的索引。如果索引为-1,则表示无法找到该元素。
  • 将结果存储为哈希,以及无法在数组中找到的名称列表。
  • JS Bin

<强>替代地

您真正想要做的是找到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?

对于每个浏览器中的Array.prototype本身提供的方法。 More info here

forEach应该应用于数组,并且该方法需要一个应该处理每个元素的函数回调。

  • 什么是(...) => { ... }

这代表arrow functions which are available in ES6。这个箭头语法提供了一种替代(在我看来,更清晰,更清晰)的方法来定义函数。

以前表示为:

的东西
function (el) {
  d.delete(el);
}

可以缩短为

(el) => d.delete(el);