如果我在JavaScript中有一个对象数组和一个对象:
var data = [{"a": 1, "b": 2}, {"a": 1}, {"a": 1, "b": 2, "c": 3}];
var myFilter = {"a": 1, "b": 2};
...并且希望使用myFilter
对象作为对象数组的过滤器来创建新的对象数组,当且仅当对象至少匹配或包含myFilter
键时/值对。
任何建议我如何才能继续并将其置于代码中?我需要创建一个使用data
键/值对从myFilter
过滤的新数组。
我能够这样做,但myFilter
只包含1个键/值对。
我期待的新阵列是:
var newArr = [];
newArr = [{"a": 1, "b": 2}, {"a": 1, "b": 2, "c": 3}];
答案 0 :(得分:4)
您可以使用arr.filter(callback[, thisArg]):
var data = [{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 3 }]
var myFilter = { "a": 1, "b": 2 }
var myFilterFunction = function(obj) {
for (var p in myFilter) {
if (obj[p] !== myFilter[p]) return false
}
return true
}
var newArr = data.filter(myFilterFunction)
document.write(JSON.stringify(newArr))
更通用的方法是这个filterFuncByObj(filterObj)
函数,它接受任何自定义过滤器对象:
data.filter(filterFuncByObj(myFilter))
:
var data = [{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 3 }]
var myFilter = { "a": 1, "b": 2 }
var newArr = data.filter(filterFuncByObj(myFilter))
// Demo Output
document.write(JSON.stringify(newArr))
function filterFuncByObj(filterObj) {
return function(obj) {
for (var p in filterObj) {
if (obj[p] !== filterObj[p]) return false
}
return true
}
}
答案 1 :(得分:3)
使用Array.filter()
,Object.keys()
和Array.every()
这可能是一种方法
var data = [{"a": 1, "b": 2}, {"a": 1}, {"a": 1, "b": 2, "c": 3}];
var myFilter = {"a": 1, "b": 2};
var filteredData = data.filter(function(d) {
return Object.keys(myFilter).every(function(f) {
return d[f] === myFilter[f];
})
});
console.log(JSON.stringify(filteredData));
答案 2 :(得分:1)
lodash方式,以防万一:
var data = [{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 3 }];
var myFilter = { "a": 1, "b": 2 };
var newArr = _.filter(data, myFilter);
document.write(JSON.stringify(newArr, null, 3));

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>
&#13;