如何检查某些值是否同时重复?

时间:2020-05-05 14:06:28

标签: arrays for-loop object key-value

我有一个类似于示例中的值的数组,我正在for循环中通过它来设置某些条件,但是到了某种程度,我不知道如何检查重复值< / p>

const objectsData:[
 a:{boxTop = 320,
   boxLeft = 1750,
   boxHeigth = 245,
   boxWidth = 310
 },
 b:{boxTop = 20,
   boxLeft = 580,
   boxHeigth = 245,
   boxWidth = 310
 },
 c:{boxTop = 320,
   boxLeft = 1750,
   boxHeigth = 245,
   boxWidth = 310
 },
 d:{boxTop = 320,
   boxLeft = 1750,
   boxHeigth = 245,
   boxWidth = 310
 },
 e:{boxTop = 136,
   boxLeft = 10,
   boxHeigth = 245,
   boxWidth = 310
 },
]

以这个对象数组为例,我需要检查哪个对象同时重复“ boxLeft”和“ boxTop”的值(在示例中为对象“ a”,“ d”和“ c”)进行修改他们添加了一个值,如果有两个以上重复值的对象,该值将增加。

欢迎任何想法。 预先非常感谢

1 个答案:

答案 0 :(得分:1)

1)我们需要一些逻辑(函数)来获取每个对象的“比较值”。例如,在给定对象a: { boxTop: 320, boxLeft: 1750, boxHeigth: 245, boxWidth: 310 }作为输入的情况下,我们希望将值(string)'{"boxTop":320,"boxLeft":1750}'作为输出,然后可以使用该字符串与其他值进行比较。

2)给定一个值,例如字符串'{"boxTop":320,"boxLeft":1750}',我们需要一些逻辑来计算该值出现在某个集合中的次数(例如列表,字典)。解决这个问题的方法有很多,我决定使用字典,其中的key代表某个值,而字典的value代表该键出现在集合中的次数。

这是一个JavaScript(节点)实现,因为您的名称中包含javascript:

const objectsData = {
    a: { boxTop: 320, boxLeft: 1750, boxHeigth: 245, boxWidth: 310 },
    b: { boxTop: 20, boxLeft: 580, boxHeigth: 245, boxWidth: 310 },
    c: { boxTop: 320, boxLeft: 1750, boxHeigth: 245, boxWidth: 310 },
    d: { boxTop: 320, boxLeft: 1750, boxHeigth: 245, boxWidth: 310 },
    e: { boxTop: 136, boxLeft: 10, boxHeigth: 245, boxWidth: 310 },
};

function getBoxLeftAndBoxTop(obj) {
    const { boxTop, boxLeft } = obj;
    return JSON.stringify({ boxTop, boxLeft });
}

const counterBoxLeftAndBoxTop = {};
for (const key of Object.keys(objectsData)) {
    const box = getBoxLeftAndBoxTop(objectsData[key]);
    const currentCount = counterBoxLeftAndBoxTop[box];
    counterBoxLeftAndBoxTop[box] = currentCount ? currentCount + 1 : 1;
}

console.log(counterBoxLeftAndBoxTop);
/* Outputs:
    {
      '{"boxTop":320,"boxLeft":1750}': 3,
      '{"boxTop":20,"boxLeft":580}': 1,
      '{"boxTop":136,"boxLeft":10}': 1
    }
    */

console.log(`Objects that appears 2 or more times: `);
for (const key of Object.keys(objectsData)) {
    const box = getBoxLeftAndBoxTop(objectsData[key]);
    const currentCount = counterBoxLeftAndBoxTop[box];
    if (currentCount >= 2) {
        console.log(key);
    }
}
/* Outputs:
    Objects that appears 2 or more times:
    a
    c
    d
    */