Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何知道一个对象是否包含另一个对象_Javascript - Fatal编程技术网

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

Javascript 如何知道一个对象是否包含另一个对象,javascript,Javascript,我试图找到一个库,它能够说明对象B是否包含对象a的所有属性和值(而不是相反!) 这意味着我发现的图书馆无法处理两件事: 对象B可能比对象A有更多的关键点,而且可能是 对 对象B的数组中的项可能多于对象B A、 这可能是真的 这基本上就是lodash的方法\uuu0.difference()所做的,但仅适用于数组中的项 我发现了一些有趣的图书馆,比如,但我需要的任何东西 我可以编写一些代码来完成这项工作,但我相信其他人以前也满足过这一需求 下面是一个包含2个对象的示例: var A = { n

我试图找到一个库,它能够说明对象B是否包含对象a的所有属性和值(而不是相反!)

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

  • 对象B可能比对象A有更多的关键点,而且可能是 对
  • 对象B的数组中的项可能多于对象B A、 这可能是真的
  • 这基本上就是lodash的方法
    \uuu0.difference()
    所做的,但仅适用于数组中的项

    我发现了一些有趣的图书馆,比如,但我需要的任何东西

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

    下面是一个包含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,而B有一个额外的属性“favoriteColor”


    你知道一个图书馆能做这种比较吗?

    你可以使用评论中链接的deepCompare的修改版本。看起来,你只需要通过键长比较就可以了

    //其中b具有所有a
    功能(a,b){
    如果(a的类型!==b的类型){
    返回false;
    }
    如果(a的类型!==“对象”){
    返回a==b;
    }
    //您可能需要在此处多填充数组高阶函数
    if(Array.isArray(a)和&Array.isArray(b)){
    返回a.every(函数(av){
    返回b.indexOf(av)!=-1;
    });
    }
    if(Object.keys(a).length>Object.keys(b).length){
    返回false;
    }
    for(a中的变量k){
    如果(!(b中的k)){
    返回false;
    }
    如果(!deepHas(a[k],b[k])){
    返回false;
    }
    }
    返回true;
    }
    变量a1={
    foo:[a',b',c'],
    酒吧:“酒吧”,
    巴兹:{
    巴兹:{
    巴兹:“wee”
    }
    }
    };
    变量b1={
    foo:[a',b',c',d'],
    酒吧:“酒吧”,
    巴兹:{
    巴兹:{
    巴兹:“wee”,
    不管怎样:“wat”
    }
    },
    好:'测试'
    };
    console.log('b1拥有所有a1',deepHas(a1,b1));
    变量a2={
    foo:[a',b',c'],
    酒吧:“酒吧”,
    巴兹:{
    巴兹:{
    巴兹:“wee”
    }
    }
    };
    变量b2={
    foo:[a',b',c'],
    巴兹:{
    巴兹:{
    巴兹:“wee”
    }
    }
    };
    log('b2没有所有的a2',!deepHas(a2,b2));
    log(“[“a”,“b”]有[“b”]”,deepHas([“b”],[“a”,“b”]);
    
    log({foo:[“a”,“b”]}有{foo:[“b”]}),deepHas({foo:[“b”]},{foo:[“a”,“b”]})寻找外部库等问题与堆栈溢出无关,因此使用这样的请求开始和结束您的问题可能会很快结束。更重要的是,若你们自己尝试这样的事情,当你们陷入困境时,把你们所做的张贴出来。在这一点上,有人会提供帮助,或者你可能会得到一些评论,说“你试过仅仅使用x了吗”这不是重复的,我们可以通过这一行很容易地看到它:if(Object.keys(obj1.length)==Object.keys(obj2.length){return false;};我在我的帖子里列举了两点,感谢第一点。@JoseRicardoBustosM:哇,你抓住我了。我读了那个问题,读了第一个答案,看到它是好的,并试图给它投票。然后出现了一个“您不能为自己的帖子投票”错误:-)但不,它不是重复的,因为这些函数检查深度相等而不是包含。@Bergi好的,我删除了重复的标志,然后。。。。有趣的“你不能为自己的帖子投票”@Bergi-这很容易修复。当然可以:-)应该是
    b.some(deephas.bind(null,av))
    而不是
    indexOf