数组对象求重复值位置

//b列和c列的值不允许重复,如果重复,获得两个重复数值的位置

  //下面每个属性的位置是
  //00) (01) (02//10) (11) (12//20) (21) (22)
  let form = [
    { a: 1, b: 2, c: 1 },
    { a: 3, b: 1, c: 2 },
    { a: 2, b: 2, c: 2 },
  ]

题目如上图,有什么好的方法推荐吗,感觉要写很多遍历不太好

参考GPT和自己的思路:

可以使用一个对象来记录每个重复的值出现的位置。具体实现步骤如下:

  1. 定义一个空对象 repeatPositions = {} 用来记录重复值出现的位置。

  2. 使用 for 循环遍历每一行对象,并记录重复的值出现的位置:

    a. 判断是否已经存在与当前行中 b、c 列相同的值,如果不存在,则将其保存在对象中,值为一个包含当前位置信息的数组。

    b. 如果该值已经存在于对象中,则将当前位置信息(行和列)添加到对应的位置信息数组中。

  3. 再次遍历对象,将每一个值对应位置信息数组的长度为 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)

img