在 JavaScript 中从一个对象搜索到另一个对象的键/值对

Searching key/value pair from one object to another in JavaScript

本文关键字:一个对象 值对 搜索 JavaScript      更新时间:2023-09-26

如果我有一个对象数组和一个 JavaScript 对象:

var data = [{"a": 1, "b": 2}, {"a": 1}, {"a": 1, "b": 2, "c": 3}];
var myFilter = {"a": 1, "b": 2};

。并希望使用myFilter对象作为对象数组的过滤器,以创建新的对象数组,当且仅当对象至少匹配或包含myFilter键/值对时。

任何建议如何继续将其放入代码中?我需要创建一个使用myFilter键/值对从data中过滤出来的新数组。

我能够做到这一点,但myFilter只包含 1 个键/值对。

我预期的新数组是:

var newArr = [];
newArr = [{"a": 1, "b": 2}, {"a": 1, "b": 2, "c": 3}];

你可以使用 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
  }
}

使用 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));

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>