如果对象在包含多个对象的数组中,如何检入JavaScript?

时间:2017-06-01 23:47:25

标签: javascript arrays loops object

我有一个给定多个对象作为条目(集合)的数组,我想检查另一个源对象是否在这些单个条目对象中。如果是这样,我想返回一个包含满足该条件的所有对象的数组。以下是带有示例的代码:

function whatIsInAName(collection, source) {
    var arr = [];
    var sourceEntries = Object.entries(source);
    for (var i = 0; i < collection.length; i++) {
        for (var j = 0; i < sourceEntries.length; i ++) {
            if((collection[i].hasOwnProperty(sourceEntries[j][0]))) {
                if(collection[i][sourceEntries[j][0]] == sourceEntries[j][1]) {
                    /*what happens here*/
                }
            }
        arr.push(collection[i]);
        }

    }
    return arr;
}

print(whatIsInAName([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 }));

显然我不知道写些什么(“这里发生了什么”)。问题基本上是第二个for循环,如果条件必须是true,那么push命令是有意义的。

感谢任何提示或帮助,谢谢!

P.S。我知道这可能不是解决它的最优雅的方式,对任何其他解决方案也很满意。

1 个答案:

答案 0 :(得分:2)

这是内置.filter功能派上用场的地方:

&#13;
&#13;
function whatIsInAName(collection, source) {
  return collection.filter((obj) => {
    for (var prop in source) {
      if (source[prop] !== obj[prop]) {
        // The source property is not found in obj - no good!
        return false;
      }
      // The source property matches one of the obj's properties - keep going!
    }
    // Made it through the checks! You've got a match!
    return true;
  });
}

console.log(whatIsInAName([{
  "a": 1,
  "b": 2
}, {
  "a": 1
}, {
  "a": 1,
  "b": 2,
  "c": 2
}], {
  "a": 1,
  "b": 2
}));
&#13;
&#13;
&#13;

或者,如果您倾向于使用库来执行此操作,可以使用Lodash非常简单地完成:

&#13;
&#13;
var collection = [{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }],
    source = { "a": 1, "b": 2 };

console.log(_.filter(collection, source));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;