我有一个给定多个对象作为条目(集合)的数组,我想检查另一个源对象是否在这些单个条目对象中。如果是这样,我想返回一个包含满足该条件的所有对象的数组。以下是带有示例的代码:
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。我知道这可能不是解决它的最优雅的方式,对任何其他解决方案也很满意。
答案 0 :(得分:2)
这是内置.filter
功能派上用场的地方:
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;
或者,如果您倾向于使用库来执行此操作,可以使用Lodash非常简单地完成:
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;