(Lodash)是否有一种方法可以检查集合中是否存在(嵌套)相同的对象?

时间:2018-11-22 17:33:35

标签: javascript match lodash

我想知道是否有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
  }
]

这与诸如How to do a deep comparison between 2 objects with lodash?之类的问题不同,因为我需要检查是否有任何收集项包含嵌套在其中的相同对象,而不是比较两个对象是否彼此相同。

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以在递归函数中使用_.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>