//b列和c列的值不允许重复,如果重复,获得两个重复数值的位置
//下面每个属性的位置是
//(0,0) (0,1) (0,2)
//(1,0) (1,1) (1,2)
//(2,0) (2,1) (2,2)
let form = [
{ a: 1, b: 2, c: 1 },
{ a: 3, b: 1, c: 2 },
{ a: 2, b: 2, c: 2 },
]
题目如上图,有什么好的方法推荐吗,感觉要写很多遍历不太好
参考GPT和自己的思路:
可以使用一个对象来记录每个重复的值出现的位置。具体实现步骤如下:
定义一个空对象 repeatPositions = {}
用来记录重复值出现的位置。
使用 for 循环遍历每一行对象,并记录重复的值出现的位置:
a. 判断是否已经存在与当前行中 b、c 列相同的值,如果不存在,则将其保存在对象中,值为一个包含当前位置信息的数组。
b. 如果该值已经存在于对象中,则将当前位置信息(行和列)添加到对应的位置信息数组中。
再次遍历对象,将每一个值对应位置信息数组的长度为 2 的值输出即为重复值的位置信息。
代码如下:
let form = [
{ a: 1, b: 2, c: 1 },
{ a: 3, b: 1, c: 2 },
{ a: 2, b: 2, c: 2 },
]
let repeatPositions = {};
for(let i=0; i<form.length; i++) {
let row = form[i];
if(repeatPositions[row.b] === undefined) {
repeatPositions[row.b] = [{row: i, col: 1}];
} else {
repeatPositions[row.b].push({row: i, col: 1});
}
if(repeatPositions[row.c] === undefined) {
repeatPositions[row.c] = [{row: i, col: 2}];
} else {
repeatPositions[row.c].push({row: i, col: 2});
}
}
for(let val in repeatPositions) {
if(repeatPositions[val].length === 2) {
console.log(`重复值 ${val} 的位置信息为:`);
console.log(`(${repeatPositions[val][0].row}, ${repeatPositions[val][0].col})`);
console.log(`(${repeatPositions[val][1].row}, ${repeatPositions[val][1].col})`);
}
}
输出结果为:
重复值 2 的位置信息为:
(0, 1)
(2, 1)
重复值 1 的位置信息为:
(0, 2)
(1, 1)
注意:此代码只满足题目中要求的 b、c 列不能重复的情况。如果要求 a、b、c 列都不能重复,可以使用类似的方法继续扩展代码。
参考GPT和自己的思路:
可以使用一个Map来记录每个不允许重复的值出现的位置,然后遍历数组,对于每一个对象,检查其b和c属性在Map中是否已经存在位置,如果存在,获取两个位置输出即可;如果不存在,将其位置记录在Map中。这种方法时间复杂度为O(n),具体的实现代码如下:
function findDuplicatePositions(form) {
const mapB = new Map(); // 记录b属性重复值的位置
const mapC = new Map(); // 记录c属性重复值的位置
const result = []; // 保存结果
for (let i = 0; i < form.length; i++) {
const item = form[i];
const bPos = mapB.get(item.b); // 获取b属性重复值的位置
const cPos = mapC.get(item.c); // 获取c属性重复值的位置
if (bPos !== undefined && cPos !== undefined) { // b和c属性都有重复值
result.push([bPos, i], [cPos, i]); // 将两个重复值的位置加入结果
}
else {
if (bPos === undefined) { // b属性无重复值,记录位置
mapB.set(item.b, i);
}
if (cPos === undefined) { // c属性无重复值,记录位置
mapC.set(item.c, i);
}
}
}
return result;
}
// 测试
const form = [
{ a: 1, b: 2, c: 1 },
{ a: 3, b: 1, c: 2 },
{ a: 2, b: 2, c: 2 },
];
console.log(findDuplicatePositions(form)); // 输出 [[0, 2], [1, 0], [2, 0]]
可以用字典,将你的值作为key
b={},c={},form.map((x,y) => {
b[x['b']] = b[x['b']] || [];
c[x['c']] = c[x['c']] || [];
b[x['b']].push(y);
c[x['c']].push(y);
})
console.log(b,c)