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

时间:2018-07-25 15:53:40

标签: 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.log(final);

所需的输出:

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

  

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

数组final中的对象应该与数组src中的对象具有相同的顺序,但是,如果还要在数组target中找到对象,则应该有一个数字(从2开始)。附加到此重复的对象。如果name + number存在,则数字必须增加1,直到在target中找不到该值

到目前为止,我的尝试:

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 个答案:

答案 0 :(得分:2)

您可以先计数,然后再将名称与调整后的计数进行映射。

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);

答案 1 :(得分: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
      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;}