代码之家  ›  专栏  ›  技术社区  ›  agustin Vraj Patel

Javascript-比较两个数组。如果在两者中都找到对象,请更改它

  •  1
  • agustin Vraj Patel  · 技术社区  · 6 年前

    我可以使用以下代码检查一个数组的对象是否也存在于另一个数组中(并在它自己的数组中显示重复项):

    var target = ['alfredo', 'john', 'sebas', 'paul', 'lionel', 'sebas2'];
    var src = ['paul', 'michael', 'sebas'];
    
    var final = target.filter(function(val) {
      return src.indexOf(val) != -1;
    });
    
    console.log(final);
    

    期望输出:

    但是,我不知道如何获得以下输出:

    final=数组[“paul2”,“michael”,“sebas3”]

    数组中的对象 final 应该与数组中原来的顺序相同 src 但是,如果对象也在数组中找到 target 应将数字(从2开始)附加到此重复对象。以防 name + number 存在,数字必须增加1,直到没有找到值。 目标

    我目前的尝试:

    var final= [];
    
    src.forEach(function(element) {
      if(target.includes(element))
        { newSrc = element+2; final.push(newSrc) } else { final.push(element) }
    });
    
    console.log(final);
    

    但是,我不知道如何处理 number + 1 没有循环的部分。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Nina Scholz    6 年前

    你可以先数数,然后用调整后的数映射名字。

    var target = ['alfredo', 'john', 'sebas', 'paul', 'lionel', 'sebas2'],
        src = ['paul', 'michael', 'sebas'],
        count = target.reduce((c, s) => (k => (c[k] = (c[k] || 0) + 1, c))(s.match(/^\D+/)[0]), Object.create(null)),
        final = src.map(s => s + (count[s] ? count[s] + 1 : ''));
    
    console.log(final);
        2
  •  1
  •   Ele    6 年前

    另一种方法是使用函数 reduce 将名称和函数分组 some 检查字符串 str + number . 这个分组过程创建一个对象来利用使用键的快速访问。

    在分组过程之后,获取生成所需输出的键。

    var target = ['alfredo', 'john', 'sebas', 'paul', 'lionel', 'sebas2'],
      src = ['paul', 'michael', 'sebas'],
      obj = src.reduce((a, str) => {
        if (target.some(s => str === s))  {
          a[str] = (a[str] || 1) + 1
          while (target.some(s => `${str}${a[str]}` === s)) a[str]++;
        } else a[str] = 0;
    
        return a;
      }, {}),
      result = Object.keys(obj).map(k => `${k}${obj[k] || '' }`);
    
    console.log(result);
    .as-console-wrapper {  max-height: 100% !important;top: 0;}