Нужна помощь, чтобы сделать проверку, когда два диапазона противоречат - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть конфигурация имени объекта, в которой у меня есть «от» и «до».

const config = {
  "0": {
    id: 0,
    from: 0,
    to: 10,
    hex: null
  },
  "1": {
    id: 1,
    from: 11,
    to: 20,
    hex: null
  },
  "2": {
    id: 2,
    from: 21,
    to: 30,
    hex: null
  },
  "3": {
    id: 3,
    from: 31,
    to: 40,
    hex: null
  },
  "4": {
    id: 4,
    from: 41,
    to: 50,
    hex: null
  }
};

Я должен проверить, что теперь диапазон будет противоречить друг другу, например: form: 0 => to: 10 и от: 5 => до: 20 здесь значение секунды противоречиво, потому что 5 лежит в диапазоне от 0 до 10

Я попытался выполнить следующее, но не полностью выполнил свое требование

function found(conf) {
  let isFound = false;
  for (let obj in conf) {
    for (let x in conf) {
      if (
        conf[obj].id !== conf[x].id &&
        (conf[x].from >= conf[obj].from && conf[x].to <= conf[obj].from)
      ) {
        console.log(conf[obj], conf[x]);
        isFound = true;
        break;
      }
    }
    if (isFound) break;
  }
  return isFound;
}
console.log(found(config));

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Создайте отдельный массив, объединив все диапазоны

const arr = Object.entries(config).map(([a, b]) => b).flatMap(({from, to}) => RANGE(from, to))

, где RANGE - метод, который возвращает массив заданных диапазонов:

const RANGE = (a,b) => Array.from((function*(x,y){
      while (x <= y) yield x++;
})(a,b));

Затем найдите дубликаты в указанном массиве, используя следующуюфункция:

function findDuplicate(array) { 
    var object = {};
    var result = [];
    array.forEach(function(item) {
      if (!object[item]) object[item] = 0;
      object[item] += 1;
    });
    for (var prop in object) {
      if (object[prop] >= 2) {
        result.push(prop);
      }
    }
    return result;
  }


const duplicates = findDuplicate(arr) 

Затем, наконец, проверьте duplicates.length

0 голосов
/ 20 сентября 2019

Попробуйте переименовать ваши переменные, чтобы они имели смысл.

Ваша логика такова: идентификаторы не совпадают, а внутренние - после внешнего, но перед внешним - с.

Никогда не будет регистрагде это вернет истину.

const config = {
  "0": { id: 0, from:  0, to: 10, hex: null },
  "1": { id: 1, from: 11, to: 20, hex: null },
  "2": { id: 2, from: 21, to: 30, hex: null },
  "3": { id: 3, from: 31, to: 40, hex: null },
  "4": { id: 4, from: 41, to: 50, hex: null }
};

console.log(found(config));

function found(conf) {
  for (let outer in conf) {
    for (let inner in conf) {
      let idsDontMatch = conf[outer].id !== conf[inner].id;
      let innerFromGteOuterFrom = conf[inner].from >= conf[outer].from;
      let innerToLteOuterFrom = conf[inner].to <= conf[outer].from;
      let innerAfterOuterButBeforeOuterFrom = innerFromGteOuterFrom && innerToLteOuterFrom;
      if (idsDontMatch && innerAfterOuterButBeforeOuterFrom) {
        console.log(conf[outer], conf[inner]);
        return true;
      }
    }
  }
  return false;
}
.as-console-wrapper { top: 0; max-height: 100% !important; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...