使用过滤器查找匹配键和值



我需要检查JSON中是否存在键值对。

filter: {department_Id: 20}
tk: {department_Id: 22, timekeeper_Name: "Tesvtda", office_Id: 2, position_Id: 1}

我可以检查对象中的过滤器键是否存在:

return tk.hasOwnProperty(Object.keys(filter)) ;

但是,我现在如何检查值?

完整功能:

filteredTimekeeperList: function() {
  return this.timekeepersList.filter(tk => {
    return this.filters.forEach(filter => {
      console.log(filter, tk);
      console.log(tk.hasOwnProperty(Object.keys(filter)));
      return tk.hasOwnProperty(Object.keys(filter)) ; // True, now I need to return if both are matches
    });
  });
}

示例:https://codesandbox.io/s/y3xqo51wqv

Input:
 timekeepersList: [
        {
          department_Id: 20,
          timekeeper_Name: "Test",
          office_Id: 1,
          position_Id: 1
        },
        {
          department_Id: 20,
          timekeeper_Name: "Test",
          office_Id: 1,
          position_Id: 1
        },
        {
          department_Id: 21,
          timekeeper_Name: "Test",
          office_Id: 1,
          position_Id: 1
        }
      ],
      filters: [
        {
          department_Id: 21
        }
      ]
Output: 
        {
          department_Id: 21,
          timekeeper_Name: "Test",
          office_Id: 1,
          position_Id: 1
        }

您可以这样做:

这个想法是,如果给定的键的值与过滤器数组对象的值匹配,则要过滤timeKeepersList。这是.some().every()将非常方便的地方。

使用.every()将确保filters数组中每个对象中的每个键都匹配给定计时员的键。如果> filters阵列中的任何对象与TimeKeeper中的任何对象,则使用.some()将返回给定的计时器。

您也可以根据您的情况将其混合并匹配。如果要返回计时器,如果任何对象匹配所有键,或者所有对象都匹配任何键。这些情况分别为.some() -> .every().every() -> .some()

var timekeepersList = [
  {
    department_Id: 20,
    timekeeper_Name: "Test",
    office_Id: 1,
    position_Id: 1
  },
  {
    department_Id: 21,
    timekeeper_Name: "Tesd332t",
    office_Id: 1,
    position_Id: 1
  },
  {
    department_Id: 20,
    timekeeper_Name: "Tesct123",
    office_Id: 2,
    position_Id: 2
  },
  {
    department_Id: 21,
    timekeeper_Name: "Tesat1ffg23",
    office_Id: 2,
    position_Id: 2
  },
  {
    department_Id: 22,
    timekeeper_Name: "Tesvtda",
    office_Id: 2,
    position_Id: 1
  }
];
var filters = [{department_Id: 20}];
var filteredData = timekeepersList.filter(tk => {
  // change .every to .some if you want partial matches
  return filters.every(function (filter) {
    // change .every to .some if you want partial matches
    return Object.keys(filter).every(function (key) {
      return tk[key] === filter[key];
    });
  });
});
console.log(filteredData);