数组重复值对象处理:确保各子数组内name1与name2值唯一
处理嵌套数组,确保子数组内name1/name2值唯一
需求说明
需保证每个子数组中的所有对象的name1和name2值唯一:同一子数组内,既不能有重复的name1值,也不能有重复的name2值,同时任意对象的name1不能和其他对象的name2值重复。
示例输入
[ [ { id: 1, name1: 'a', name2: 'b' }, { id: 2, name1: 'c', name2: 'd' }, { id: 3, name1: 'e', name2: 'a' } ], [ { id: 4, name1: 't', name2: 'k' }, { id: 5, name1: 'j', name2: 'h' }, { id: 6, name1: 'z', name2: 'x' } ] ]
问题分析
示例中第一个子数组里,id=1的对象name1为'a',id=3的对象name2为'a',二者值重复,不符合要求。需要将id=3的对象移至第一个不存在该重复值的子数组中。
处理后结果
[ [ { id: 1, name1: 'a', name2: 'b' }, { id: 2, name1: 'c', name2: 'd' } ], [ { id: 4, name1: 't', name2: 'k' }, { id: 5, name1: 'j', name2: 'h' }, { id: 6, name1: 'z', name2: 'x' }, { id: 3, name1: 'e', name2: 'a' } ] ]
特殊情况处理
如果遍历所有现有子数组后,发现每个子数组都存在目标对象name1或name2的重复值,则需要新建一个子数组,将该对象存入其中。
实现代码(JavaScript)
function processNestedArrays(arrays) { // 遍历每个子数组,逐个检查并调整对象位置 for (let i = 0; i < arrays.length; i++) { const currentSubArray = arrays[i]; // 用Set记录当前子数组已存在的name1和name2值 const existingValues = new Set(); // 倒序遍历,方便移除元素时不打乱索引 for (let j = currentSubArray.length - 1; j >= 0; j--) { const obj = currentSubArray[j]; const { name1, name2 } = obj; // 检查当前对象的name1或name2是否已存在于当前子数组的Set中 if (existingValues.has(name1) || existingValues.has(name2)) { // 移除当前对象 const removedObj = currentSubArray.splice(j, 1)[0]; // 寻找可以存放该对象的子数组 let placed = false; // 从当前子数组的下一个开始找 for (let k = i + 1; k < arrays.length; k++) { const targetSubArray = arrays[k]; const targetValues = new Set(); // 收集目标子数组的所有name1和name2 targetSubArray.forEach(item => { targetValues.add(item.name1); targetValues.add(item.name2); }); // 如果目标子数组没有重复值,就放进去 if (!targetValues.has(name1) && !targetValues.has(name2)) { targetSubArray.push(removedObj); placed = true; break; } } // 如果所有现有子数组都不行,新建子数组存放 if (!placed) { arrays.push([removedObj]); } } else { // 没有重复,把当前对象的name1和name2加入Set existingValues.add(name1); existingValues.add(name2); } } } return arrays; } // 测试示例输入 const input = [ [ { id: 1, name1: 'a', name2: 'b' }, { id: 2, name1: 'c', name2: 'd' }, { id: 3, name1: 'e', name2: 'a' } ], [ { id: 4, name1: 't', name2: 'k' }, { id: 5, name1: 'j', name2: 'h' }, { id: 6, name1: 'z', name2: 'x' } ] ]; console.log(processNestedArrays(input));
内容的提问来源于stack exchange,提问作者killswitch99
相关产品推荐
相关产品推荐

