【问题标题】:Google Apps Script: Find the location of every item in arrayGoogle Apps 脚本:查找数组中每个项目的位置
【发布时间】:2020-04-18 12:07:08
【问题描述】:

我想遍历一维数组中的每个项目并在另一个一维数组上执行 indexOf 以确定它匹配的位置。

如果我有:

Array 1 = ["a","d","e"]
Array 2 = ["a","b","c","d","e","f"]

我想将数组 1 从值转换为匹配位置:[0,3,4]

我尝试了下面的等式,但它不起作用。我认为使用 forEach() 我可以遍历数组 1 中的每个项目。然后我可以运行一个函数来为每个项目在数组 2 上执行 indexOf()。我做错了什么??

var array1 = ["a","d","e"];
var array2 = ["a","b","c","d","e","f"];

var array1count = array1.forEach( function (e) { array2.indexOf( e )});

Logger.log(array1count)

【问题讨论】:

  • array1 排序为array2
  • 没有每个数组的顺序是随机的。在我给出的示例中,它们是按字母顺序排列的巧合,但用例版本不是。

标签: javascript arrays google-apps-script indexof


【解决方案1】:

如果array1array2 具有相同的顺序,您可以对索引进行闭包并在回调内部使用while 循环来映射找到的索引。

var array1 = ["a", "d", "e"],
    array2 = ["a", "b", "c", "d", "e", "f"],
    indices = array1.map((i => v => {
        while (array2[++i] !== v) ;
        return i;
    })(-1));

console.log(indices); // [0, 3, 4]

对于未定义的顺序,您既不需要一个循环来收集索引,也不需要另一个循环来映射收集到的索引。

var array1 = ["a", "d", "e"],
    array2 = ["a", "b", "c", "d", "e", "f"],
    indices = array1.map(
        Map.prototype.get,
        array2.reduce((m, v, i) => m.set(v, i), new Map)
    );

console.log(indices); // [0, 3, 4]

【讨论】:

    【解决方案2】:

    forEach()返回undefined,你可以试试Array.prototype.reduce()

    reduce() 方法对数组的每个元素执行(您提供的)reducer 函数,从而产生单个输出值。

    var array1 = ["a","d","e"];
    var array2 = ["a","b","c","d","e","f"];
    
    var array1count = array2.reduce(function(acc, curr, i) { 
      if(array1.includes(curr)) //check if the current item is present in array1 
        acc.push(i);
      return acc;
    },[]);
    
    console.log(array1count);

    【讨论】:

      【解决方案3】:

      我运行了这个方程,它奏效了。似乎非常简单明了。希望我在这里没有遗漏其他答案正在解决的问题。

      var array1 = ["a","d","e"];
      var array2 = ["a","b","c","d","e","f"];
      
      var array1count = array1.map( function (item) { return array2.indexOf(item) });
      
      Logger.log(array1count)
      

      【讨论】:

      • 哦...如果你能理解this answer!在编程中,我们主要处理时间和空间复杂性——用外行的话来说,代码可以运行多快和多流畅。您的代码:indexOf 循环遍历 array2 以找到 item。它对array1 中的每个item 执行此操作。因此,如果两个数组中都有 n 项,则要加载的项数 = nxn = n^2(指数)。这个答案不仅在 n+n=2n(linear) 中处理它,而且做得非常优雅。 Ref
      • 是的,我现在太缺乏经验,无法理解这个答案,但我感谢您将时间和空间概念引导给我,并向我展示它是如何应用在这里的!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 2019-08-20
      • 2022-09-23
      • 2019-02-21
      • 1970-01-01
      相关资源
      最近更新 更多