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

Javascript-比较两个数组。如果在两者中都找到对象,请将其更改,javascript,arrays,Javascript,Arrays,我可以使用以下代码检查一个数组的对象是否也存在于另一个数组中(并在其自己的数组中显示重复项): 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.lo

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

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开始)附加到此复制对象。如果存在
名称+编号
,则编号必须增加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
部分而不重复循环中的循环等。

您可以先计数,然后将名称与调整后的计数对应起来

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+(计数[s]?计数[s]+1:'');

控制台日志(最终)
另一种方法是使用函数
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
而(target.some(s=>`${str}${a[str]}`==s))a[str]++;
}否则a[str]=0;
返回a;
}, {}),
result=Object.keys(obj.map)(k=>`${k}${obj[k]| |''''}');
控制台日志(结果)

.as控制台包装{最大高度:100%!重要;顶部:0;}
Hmmm。。。我认为我能给出的最好答案是:改变你的数据结构。为什么不干脆
{michael:2,john:1…}
或者至少清楚地分开索引和用户名,比如
用户名#12
?@Andreas感谢您的反馈。我更新了我的问题,以反映我的努力far@JonasW. 输入按原样来。。。我可以用这个结构创建一个新的阵列反射。。。好主意。谢谢尼娜。。。这是一组我根本不知道的新函数。我试图避免循环中的循环,这是非常完美的。我只需要慢慢地看一遍,试着理解reduce和map是如何工作的。