首页 > 解决方案 > 查看值是否存在于多个数组中,如果存在则更改一个数组中的值

问题描述

假设我有以下两个数组:

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"
  }
]

输出说明

  1. Bob 是独一无二的,所以没有对第一个对象做任何实际操作arrToChangeAndCompare
  2. 与 相比,Joe 不是唯一的arrtoCompare,因此需要更改其编号。但是,由于 Joe1 也存在arrToChangeAndCompare,它必须再次递增到 Joe2
  3. Alise 对两个数组都是唯一的,因此没有对第三个对象进行实际操作arrToChangeAndCompare
  4. Joe1 与 相比不是唯一的arrtoCompare,因此 Joe1 必须递增到 Joe2,但由于 Joe2 也存在于 中arrToChangeAndCompare,因此它必须递增到 Joe3
  5. arrToChangeAndCompare与它自己的数组相比,现在所有的值都是唯一的,并且arrtoCompare

请根据需要提出其他问题。非常感谢您的帮助!

标签: javascriptarraysjavascript-objects

解决方案


您可以使用Setwithname和字母部分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; }


推荐阅读