javascript - 如何知道一个对象是否包含另一个对象

标签 javascript

我正试图找到一个库能够判断对象 B 是否包含对象 A 的所有属性和值(而不是相反!)。

这意味着我发现的图书馆无法处理的两件事:

  1. 对象 B 可以比对象 A 拥有更多的键,并且它可以是 是的。
  2. 对象 B 的数组中的项目可能多于对象 A,这可能是真的。

这基本上就是 lodash 的方法 _.difference() 所做的,但仅适用于数组中的项目。

我发现了一些有趣的库,比如 deep-diff , 但任何我需要的东西。

我可以编写一些代码来完成这项工作,但我相信其他人以前也满足过这种需求。

这是一个包含 2 个对象的示例:

var A = {
  name: 'toto',
  pets: [ { name: 'woof', kind: 'dog' } ]
};

var B = {
  name: 'toto',
  pets: [ { name: 'gulp', kind: 'fish' }, { name: 'woof', kind: 'dog' } ],
  favoriteColor: 'blue'
};

这里,A 包含 B,因为我们可以在 B 中找到 A 的所有属性和值。 但是像 diff 这样的库会拒绝,因为这不是等于 A 的“pets”的第一项而是第二项,并且 B 有一个附加属性“favoriteColor”。

您知道可以进行这种比较的图书馆吗?

最佳答案

您可以使用评论中链接的 deepCompare 的修改版本。看起来,您真的只需要通过 key 长度比较。

// where b has all of a
function deepHas(a, b) {
  if (typeof a !== typeof b) {
    return false;
  }
  if (typeof a !== 'object') {
    return a === b;
  }

  // you may need to polyfill array higher-order functions here
  if(Array.isArray(a) && Array.isArray(b)) {
    return a.every(function(av) {
      return b.indexOf(av) !== -1;
    });
  }
  
  if (Object.keys(a).length > Object.keys(b).length) {
    return false;
  }
  for (var k in a) {
    if (!(k in b)) {
      return false;
    }
    if (!deepHas(a[k], b[k])) {
      return false;
    }
  }
  return true;
}


var a1 = {
  foo: ['a', 'b', 'c'],
  bar: 'bar',
  baz: {
    baz: {
      baz: 'wee'
    }
  }
};

var b1 = {
  foo: ['a', 'b', 'c', 'd'],
  bar: 'bar',
  baz: {
    baz: {
      baz: 'wee',
      whatever: 'wat'
    }
  },
  ok: 'test'
};

console.log('b1 has all of a1', deepHas(a1, b1));

var a2 = {
  foo: ['a', 'b', 'c'],
  bar: 'bar',
  baz: {
    baz: {
      baz: 'wee'
    }
  }
};

var b2 = {
  foo: ['a', 'b', 'c'],
  baz: {
    baz: {
      baz: 'wee'
    }
  }
};

console.log('b2 does not have all of a2', !deepHas(a2, b2));

console.log('["a","b"] has ["b"]', deepHas(["b"], ["a","b"]));

console.log('{foo: ["a","b"]} has {foo: ["b"]}', deepHas({ foo: ["b"] }, { foo:["a","b"] }));

关于javascript - 如何知道一个对象是否包含另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30246439/

相关文章:

javascript - 需要在MySQL中查找返回某个结果的查询

javascript - 带有 codeigniter 3 的图表栏

javascript - 使用 AJAX 发送的变量在 PHP 中未定义

javascript - QML 中 default 关键字的用途是什么?

javascript - PHP 在尝试验证表单时不会显示 HTML

javascript - jQuery 循环内嵌套函数的效率

javascript - 仅在一个菜单中禁用数据自动关闭下拉基础

javascript - 使用 jquery .html() 插入 html

javascript - 如何使 jquery.dynamiclist 使用较新版本的 jquery 运行?

javascript - 使用javascript根据从数据库中获取的值更改输入字段边框颜色