【问题标题】:(Lodash) Is there a method to check if an identical object exists (nested) in a collection?(Lodash)是否有一种方法可以检查集合中是否存在(嵌套)相同的对象?
【发布时间】:2018-11-22 17:33:35
【问题描述】:

我想知道是否有 Lodash 方法来解决这个问题,否则我会使用 for 循环来解决。如果collection 包含一个或多个嵌套对象与c 相同的元素,我想返回true

以下示例将返回 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? 等问题不同,因为我需要检查任何集合项是否包含嵌套在其中的相同对象,而不是比较两个对象是否彼此相同。

提前感谢您的帮助。

【问题讨论】:

标签: javascript match lodash


【解决方案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>

【讨论】:

  • 这很好而且简洁。谢谢。
猜你喜欢
  • 1970-01-01
  • 2022-01-04
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
相关资源
最近更新 更多