Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.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_Arrays_Object - Fatal编程技术网

Javascript 比较对象数组。返回匹配的对象键&;价值观

Javascript 比较对象数组。返回匹配的对象键&;价值观,javascript,arrays,object,Javascript,Arrays,Object,目标 生成一个函数,用于查看列表(集合)并返回具有等效属性值(源)的所有对象的数组 示例#1 function where(collection, source) { var arr = []; return arr; } where([ { first: 'Romeo', last: 'Montague' }, { first: 'Mercutio', last: null }, { fir

目标

生成一个函数,用于查看列表(集合)并返回具有等效属性值(源)的所有对象的数组


示例#1

    function where(collection, source) {
      var arr = [];
      return arr;
    }

    where([
        { first: 'Romeo', last: 'Montague' }, 
        { first: 'Mercutio', last: null }, 
        { first: 'Tybalt', last: 'Capulet' }], 

        { last: 'Capulet' });
[{ first: 'Tybalt', last: 'Capulet' }]
预期产出#1

    function where(collection, source) {
      var arr = [];
      return arr;
    }

    where([
        { first: 'Romeo', last: 'Montague' }, 
        { first: 'Mercutio', last: null }, 
        { first: 'Tybalt', last: 'Capulet' }], 

        { last: 'Capulet' });
[{ first: 'Tybalt', last: 'Capulet' }]

示例#2

where(
    [{ 'a': 1 }, 
     { 'a': 1 },  
     { 'a': 1, 'b': 2 }], 

     { 'a': 1 }), 
[{ 'a': 1 }, { 'a': 1 }, { 'a': 1, 'b': 2 }]
预期产出#2

where(
    [{ 'a': 1 }, 
     { 'a': 1 },  
     { 'a': 1, 'b': 2 }], 

     { 'a': 1 }), 
[{ 'a': 1 }, { 'a': 1 }, { 'a': 1, 'b': 2 }]

问题

  • 通常我会包含一些Psuedo代码来突出我的思维过程。然而,我觉得我掉进兔子洞太深了。这里最好的方法是什么?我应该将对象展平成阵列吗?对象是否有等效的indexOf()
  • 我听说您可以使用Object.keys()和.hasOwnProperty()来帮助实现这一点,但无法理解这两个方法如何协同工作来解决这个问题

  • ->解决方案1:使用Lodash
    其中

    对于此类问题,可以使用实用程序库

    Lodash已经具有您需要的功能

    请参见下面的示例

    var out=\其中([{
    第一个:“罗密欧”,
    最后一句:“蒙太古”
    }, {
    第一个:'美库西奥',
    最后:空
    }, {
    第一个:“提伯特”,
    最后一句:“卡普莱特”
    }],
    {
    最后一句:“卡普莱特”
    });
    document.getElementById('out').innerHTML=JSON.stringify(out);
    var out2=389;。其中(
    [{
    “a”:1
    }, {
    “a”:1
    }, {
    "a":1,,
    b:2
    }],
    {
    “a”:1
    });
    document.getElementById('out2').innerHTML=JSON.stringify(out2)
    
    
    

    由于您无法使用外部库,因此有一种简单的方法可以满足您的需要:

    function where(collection, source) {
       var keys = Object.keys(source);
    
       return collection.filter(function (item) {
          return keys.every(function (key) {
             return source[key] == item[key];
          });
       });
    }
    

    因此,您的困难在于如何检索
    source
    ?Lodash中指定的密钥以进行救援@TedHopp Yes-我的困难是检索数组中的嵌套键和值,然后将它们与另一个对象进行比较array@Amit不幸的是,这是在线学习课程的一部分,我无法导入自己的库:(您可能会发现该函数很有用。不幸的是,我的问题是在线课程的一部分,我无法导入自己的库:(您可以在lodash库中检查
    where
    的实现。请参阅@jad panda您是否查看了您提供的链接?您基本上是在把读者送到兔子洞里。@jad panda-我想您做得很好(不打算验证:-),但请注意最初的问题是什么…您的解决方案可能是一个exterme overkill。当有人寻找这种复杂性时,最好使用一个外部库。@Amit解决方案并没有过度使用它仅有的30行代码。剩下的代码是测试。只验证
    在哪里
    正常工作。它对嵌套库不起作用虽然这不是需求的一部分,但解决方案可以扩展以进行深入比较,但会更加复杂。