Поиск совпадающих значений в отдельных объектах - PullRequest
0 голосов
/ 09 мая 2018

У меня есть два объекта:

const have = {
  a: true,
  b: {
    c: true,
    d: true
  }
};

const need = {
  a: false,
  b: {
    c: true,
    d: false
  }
};

Мне нужно найти в объекте "need", если есть хотя бы одно положительное совпадение (true) с объектом "have". В этом случае они совпадают в b.c, так как оба истинны.

Есть идеи, как мне с этим столкнуться? может сначала разбирать массив? Зациклить объект?

Обновление:

Объект 'need' не всегда содержит все одинаковые ключи. Может быть меньше, но не иначе.

пример:

const need = {
  b: {
    c: true,
  }
};

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Аналогичный подход к принятому ответу, за исключением того, что приведенный ниже немного более оптимизирован для конкретного случая использования ОП, предполагая, что данные являются «имитационными», а сравниваемые значения являются либо объектом, либо «правдивым».

const have = { a: true, b: { c: true, d: true } };
const need = { b: { c: true } };

const hn = (h, n) => // 'have/need' iterator
  Object.keys(n).some(i => // at least one truthy 'need':
    typeof n[i] === 'object' && hn(h[i], n[i]) // recursive on object
    || n[i] && n[i] === h[i]); // or both h & n are equal and truthy


const has = hn(have, need);
console.log(has);
0 голосов
/ 09 мая 2018

Если ключи и структуры объектов всегда совпадают, вы можете выполнить рекурсивную проверку ключей / значений:

const have = {
  a: true,
  b: {
    c: true,
    d: true
  }
};

const need = {
  a: false,
  b: {
    c: true,
    d: false
  }
};

function objectsHaveMatch(obj1, obj2) {
  return Object.entries(obj1).some(([key, obj1Val]) => {
    if (!obj2[key]) return false;
    if (typeof obj1Val !== 'boolean') return objectsHaveMatch(obj1Val, obj2[key]);
    return obj1Val === true && obj2[key] === true;
	});
}

const atLeastOneMatch = objectsHaveMatch(have, need);
console.log(atLeastOneMatch);

Также работает с более сложными структурами:

const have = {
  a: true,
  b: {
    c: false,
    d: true,
    foo: {
      q: false,
      w: false,
      e: false,
      r: {
        t: true
      }
    }
  }
};

const need = {
  a: false,
  b: {
    c: true,
    d: false,
    foo: {
      q: true,
      w: true,
      e: true,
      r: {
        t: false
      }
    }
  }
};

function objectsHaveMatch(obj1, obj2) {
  return Object.entries(obj1).some(([key, obj1Val]) => {
    if (!obj2[key]) return false;
    if (typeof obj1Val !== 'boolean') return objectsHaveMatch(obj1Val, obj2[key]);
    return obj1Val === true && obj2[key] === true;
	});
}

const atLeastOneMatch = objectsHaveMatch(have, need);
console.log(atLeastOneMatch);

Пример фрагмента с отсутствующими свойствами:

const have = {
  a: true,
  b: {
    c: true,
    d: true,
    foo: {
      q: false,
      w: false,
      e: false,
      r: {
        t: true
      }
    }
  }
};

const need = {
  b: {
    c: true,
  }
};

function objectsHaveMatch(obj1, obj2) {
  return Object.entries(obj1).some(([key, obj1Val]) => {
    if (!obj2[key]) return false;
    if (typeof obj1Val !== 'boolean') return objectsHaveMatch(obj1Val, obj2[key]);
    return obj1Val === true && obj2[key] === true;
	});
}

const atLeastOneMatch = objectsHaveMatch(have, need);
console.log(atLeastOneMatch);
...