javascript - 查看值是否存在于多个数组中,如果存在则更改一个数组中的值
问题描述
假设我有以下两个数组:
var arrToChangeAndCompare = [{name:'Bob'},{name:'Joe'},{name:'Alise'},{name:'Joe1'}];
var arrToCompare = [{name:'Frank'},{name:'Joe'},{name:'Jen'},{name:'Joe1'}];
而且我希望第一个数组仅包含其所在数组中的唯一名称,而且与第二个数组(arrToCompare)相比,还包含唯一名称。需要明确的是,我不想删除不唯一的值,我想在“arrToChangeAndCompare”中更改它们,以便它们对两个数组都是唯一的。请记住,如果“arrToCompare”中有非唯一值,则无关紧要。唯一的规则是“arrToChangeAndCompare”在其数组中只有唯一的名称,并且与“arrToCompare”相比,名称也是唯一的。
我有以下代码几乎可以满足我的要求,但是一旦将第一个数组中的值更改为唯一值,它就不会再次检查第二个数组,这会导致“arr”数组具有所有唯一值,但是“arr”值在两个数组中都不是唯一的(Joe1 存在于第一个数组和第二个数组中)。
几乎可以工作的代码
var arr = [{name:'Bob'},{name:'Joe'},{name:'Alise'},{name:'Joe1'}];
var arr2 = [{name:'Frank'},{name:'Joe'},{name:'Jen'},{name:'Joe1'}];
var arr3;
arr2.forEach(e2 => {
arr3 = arr.map(e => {
var name = e.name.match(/[a-zA-Z]*/)[0]
if (e2.name === name) {
var number = e.name.match(/[0-9]+/)
if (number) {
e.name = name + (+number[0] + 1)
} else {
e.name = name + 1
}
}
return e
})
})
console.log(arr3)
顶部列出的数组的预期输出将是一个如下所示的数组:
[
{
"name": "Bob"
},
{
"name": "Joe2"
},
{
"name": "Alise"
},
{
"name": "Joe3"
}
]
输出说明
- Bob 是独一无二的,所以没有对第一个对象做任何实际操作
arrToChangeAndCompare
- 与 相比,Joe 不是唯一的
arrtoCompare
,因此需要更改其编号。但是,由于 Joe1 也存在arrToChangeAndCompare
,它必须再次递增到 Joe2 - Alise 对两个数组都是唯一的,因此没有对第三个对象进行实际操作
arrToChangeAndCompare
- Joe1 与 相比不是唯一的
arrtoCompare
,因此 Joe1 必须递增到 Joe2,但由于 Joe2 也存在于 中arrToChangeAndCompare
,因此它必须递增到 Joe3 arrToChangeAndCompare
与它自己的数组相比,现在所有的值都是唯一的,并且arrtoCompare
请根据需要提出其他问题。非常感谢您的帮助!
解决方案
您可以使用Set
withname
和字母部分name
并进行检查。
如果未找到添加字符串以设置并返回值。
如果找到,则取字母、数字并递增数值,直到集合中不再有组合字符串。然后更新集合并返回新字符串。
var array1 = [{ name: 'Bob', foo: 42 }, { name: 'Bob', bar: 42 }, { name: 'Bob' }, { name: 'Joe' }, { name: 'Joe' }, { name: 'Joe' }, { name: 'Alise' }, { name: 'Joe1' }],
array2 = [{ name: 'Frank' }, { name: 'Joe' }, { name: 'Jen' }, { name: 'Joe1' }],
items = array2.reduce((s, { name }) => s.add(name).add(name.match(/^\D+/)[0]), new Set),
result = array1.map(({ name, ...o }) => {
if (!items.has(name)) {
items.add(name);
return { name, ...o };
}
var [letters, digits = 0] = name.split(/(\d+)/);
digits = +digits;
while (items.has(letters + ++digits));
items.add(letters + digits);
return { name: letters + digits, ...o };
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- java - 当资源不存在时,SpringBoot 有什么方法可以返回配置 bean?
- c - 如何以与 IIS 不同的用户身份写入文件?
- python - 在 Pandas Dataframe 中创建一个新列,从 URI 中提取域
- python - 从字符串中匹配字典中的“键”,并返回“值”
- ruby-on-rails - Rails ActiveRecord 选择按时间戳排序的不同记录
- reactjs - 如何在 React js 中映射嵌套评论?
- node.js - 使用 graphql 和简单的 express nodejs 设置导致错误和错误
- javascript - 如果没有子列表,如何扩展列表?
- javascript - Javascript 不会影响我的烧瓶引导网站中的导航栏
- python - 有条件地增加熊猫