我有一个用于解决JavaScript中某个问题的伪代码,但我似乎无法理解如何将其转换为代码:
var sampleCollection = [
{ 'a': 1, 'b': 2, 'c': 3 },
{ 'a': 4, 'b': 5, 'c': 6 }
];
var sampleFilter = { 'a': 4, 'c': 6 };
function getCollectionFilter(collection,filter) {
function collectionFilter(collection,filter) {
//return if for each element in filter,
//collection's key/value pair is same with filter's key/value pair
}
return collection.filter(collectionFilter);
}
getCollectionFilter(sampleCollection,sampleFilter);
// -> { 'a': 4, 'b': 5, 'c': 6};
我认为lodash有_.matches来解决这个问题,但我想知道为什么事情会以某种方式完成,如果不这样做会产生什么影响/后果。
在现实世界中提供有关解决方案/实践为何“最佳”的背景的奖励
答案 0 :(得分:3)
使用 Array#filter
和 Array#every
方法
var sampleCollection = [{
'a': 1,
'b': 2,
'c': 3
}, {
'a': 4,
'b': 5,
'c': 6
}];
var sampleFilter = {
'a': 4,
'c': 6
};
function getCollectionFilter(collection, filter) {
// filter out elements and return
return collection.filter(function(v) {
// get all object keys
return Object.keys(filter)
// use `every` method and check all values are equal
.every(function(k) {
// compare values
return filter[k] == v[k];
});
})
}
console.log(
getCollectionFilter(sampleCollection, sampleFilter)
);
使用ES6 arrow function,您可以将其设为一行。
var sampleCollection = [{
'a': 1,
'b': 2,
'c': 3
}, {
'a': 4,
'b': 5,
'c': 6
}];
var sampleFilter = {
'a': 4,
'c': 6
};
function getCollectionFilter(collection, filter) {
return collection.filter(v => Object.keys(filter).every(k => filter[k] == v[k]))
}
console.log(
getCollectionFilter(sampleCollection, sampleFilter)
);
答案 1 :(得分:0)
类似于Pranav C Balan的回答(打我一拳)......我只是使用过滤器工厂来创建传递给Array.prototype.filter
的函数,而不是要求将集合作为参数并执行在实际比较值之前,预先检查是否存在匹配键。
let filterer = test => {
let keys = Object.keys(test).sort();
let keyMatch = new RegExp(keys.toString);
return obj => {
let objKeys = Object.keys(obj).sort().toString();
return objKeys.match(keyMatch) && keys.every(k => test[k] === obj[k]);
}
};
let passes = arrOfObjects.filter(filterer(testCase));