(Lodash) Есть ли способ проверить, существует ли идентичный объект (вложенный) в коллекции? - PullRequest
0 голосов
/ 22 ноября 2018

Мне было интересно, есть ли подход Lodash к этой проблеме, который я бы иначе решил с помощью цикла for.Я хотел бы вернуть true, если collection содержит один или несколько элементов с вложенным объектом, идентичным c.

В приведенном ниже примере будет возвращено true, поскольку collection[1] содержит идентичный c.

Игла:

c = {
  x: 11,
  y: 22,
  z: 33
}

Стог сена:

collection = [
  {
    a: 1,
    b: 1,
    c: {
      x: 10,
      y: 20,
      z: 30
    },
    d: 1
  },
  {
    a: 1,
    b: 1,
    c: {
      x: 11,
      y: 22,
      z: 33
    },
    d: 1
  },
  {
    a: 1,
    b: 1,
    c: {
      x: 12,
      y: 24,
      z: 36
    },
    d: 1
  }
]

Это отличается от вопросов, таких как Как провести глубокое сравнение между двумя объектами с помощью lodash? потому что мне нужно проверить, содержит ли какой-либо из элементов коллекции идентичный объект, вложенный в них, а не сравнивать, являются ли два объекта идентичными друг другу.

Заранее спасибо за вашу помощь.

1 Ответ

0 голосов
/ 22 ноября 2018

Вы можете использовать _.isEqual в рекурсивной функции:

function find(h, n) {
  if (_.isEqual(h, n)) return true;

  let found;
  if (Array.isArray(h)) {
    for (let e of h) {
      found = find(e, n);
      if (found) return found;
    }
  } else if (h instanceof Object) {
    return find(Object.values(h), n);
  }
  
  return false;
}


var c = {
  x: 11,
  y: 22,
  z: 33
};

var d = {
  x: 1111,
  y: 2222,
  z: 32223
};


var collection = [{
    a: 1,
    b: 1,
    c: {
      x: 10,
      y: 20,
      z: 30
    },
    d: 1
  },
  {
    a: 1,
    b: 1,
    c: {
      x: 11,
      y: 22,
      z: 33
    },
    d: 1
  },
  {
    a: 1,
    b: 1,
    c: {
      x: 12,
      y: 24,
      z: 36
    },
    d: 1
  }
];

console.log(find(collection, c));
console.log(find(collection, d));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
...