как проверить, повторяются ли определенные значения одновременно? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть массив значений, подобных показанному в примере, который я просматриваю в for l oop, чтобы установить определенные условия, но я дохожу до точки, когда не знаю, как проверить повторяющиеся значения

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 Ответ

1 голос
/ 05 мая 2020

1) Нам нужно какое-то logi c (функция), чтобы получить «значение сравнения» каждого объекта. Например, учитывая объект a: { boxTop: 320, boxLeft: 1750, boxHeigth: 245, boxWidth: 310 } в качестве входных данных, нам нужно значение (строка) '{"boxTop":320,"boxLeft":1750}' в качестве выходных данных, а затем мы можем использовать эту строку для сравнения с другими значениями.

2) Учитывая значение , например, строка '{"boxTop":320,"boxLeft":1750}', нам нужно несколько logi c, чтобы подсчитать, сколько раз это значение появлялось в некоторой коллекции (например, в списке, словаре). Есть много способов решить эту проблему, я решил использовать словарь, в котором 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
    */
...