我可以使用以下代码检查另一个数组中是否也存在一个数组的对象(并在其自己的数组中显示重复项):
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
部分而又不重复循环等。
答案 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;}