仅检查两个对象共有的属性。返回具有匹配属性值的每个对象[重复]

Posted

技术标签:

【中文标题】仅检查两个对象共有的属性。返回具有匹配属性值的每个对象[重复]【英文标题】:Check only the properties that two objects have in common. Return every object with matching property values [duplicate] 【发布时间】:2022-01-22 12:21:18 【问题描述】:

我正在编写一个过滤器以仅显示基于关键字的某些元素。所以我有一个这种键/对格式的对象数组:

name: "Accounting (AAS) | Business, Design & Hospitality Pathway",
type: "associate of arts",
method: "clas-s-room based",
location: "centennial campus",
pathway: "business, design, & hospitality",
time: "4 semesters",
transfer: "transferable"

我有一个从单选按钮创建的对象。它被称为选定过滤器。如果只检查一个收音机,它将返回:

type: 'associate of arts'

如果检查了两个无线电:

type: 'associate of arts', method: 'hyflex class'

所以第二个对象没有第一个对象的所有属性。我需要检查他们确实具有的共同属性是否匹配。所以如果单选按钮创建的对象有两个属性。如果两个属性都匹配,我只希望对象返回。

我的 forEach 循环中有一个 if 语句。但只有在每个属性都匹配时才会返回。有人能找到解决方案,所以我只推送存在的属性匹配的对象吗?

data.forEach(function(el) 
    if (
      el.type == selectedFilters.type &&
      el.method == selectedFilters.method &&
      el.location == selectedFilters.location &&
      el.pathway == selectedFilters.pathway &&
      el.time == selectedFilters.time &&
      el.transfer == selectedFilters.transfer
    ) 
      result.push(el);
    ;
  );

【问题讨论】:

也许这能让你走上正轨***.com/questions/34392741/… @VincentMenzel 那些正在返回匹配的键。我需要遍历我的第一个数组中的每个对象,并且只返回与我的“selectedFilters”对象中的所有键/值匹配的对象。 @VincentMenzel 谢谢!那确实回答了我的问题。其他人提出了类似的解决方案,但我认为这更简洁。 【参考方案1】:

使用Object.entries()Array.every() 根据数据数组过滤来自无线电对象的条目

const radioObj = 
  A: 1,
  C: 2
,
radioEntries =  Object.entries(radioObj),
data = [
    A: 1,
    B: 3,
    C: 2
  ,
  
    A: 2,
    B: 2,
    C:2
  

]



const res = data.filter(e => radioEntries.every(([k,v]) => e[k] === v))

console.log(res)

【讨论】:

【参考方案2】:

首先,单选按钮只有一个可能的选择。您正在寻找复选框。

现在,如果我正确理解了您的问题,那么您就错了,因为您总是在检查候选对象中的每个属性。您需要做的是遍历“您从单选按钮创建的对象”(在我的示例代码中为selectedFilters),检查每个 那些 属性的值是否等于你的候选对象。

这是一个例子:

    let objs = [
      
        name: "Accounting (AAS) | Business, Design & Hospitality Pathway",
        type: "associate of arts",
        method: "clas-s-room based",
        location: "centennial campus",
        pathway: "business, design, & hospitality",
        time: "4 semesters",
        transfer: "transferable"
      ,
      
        name: "Accounting (AAS) | Business, Design & Hospitality Pathway",
        type: "associate of arts",
        method: "clas-s-room based",
        location: "centennial campus",
        pathway: "art, music and history",
        time: "4 semesters",
        transfer: "transferable"
      ,
      
        name: "Accounting (AAS) | Business, Design & Hospitality Pathway",
        type: "associate of science",
        method: "clas-s-room based",
        location: "centennial campus",
        pathway: "business, design, & hospitality",
        time: "4 semesters",
        transfer: "transferable"
      ,
    ]  

    let selectedFilters = 
      type: "associate of arts",
      method: "clas-s-room based",
    

    function checkObj(obj, selectedFilters) 
      for (x in selectedFilters) 
        if (obj[x] !== selectedFilters[x]) return false;
      

      return true;
    

    let result = [];
    for (obj of objs) 
      if (checkObj(obj, selectedFilters)) result.push(obj)
    
    console.log(result);

在测试中,我使用selectedFilters 和两个选定的属性。在数组中的对象中,不应选择第三个,因为type 属性不同。因此,checkObj 函数只运行selectedFilters 属性并将它们与传入的对象进行比较。由于它正在迭代检查对象,它会忽略检查对象没有的任何属性。

因此,您遍历候选对象数组,为每个对象调用objCheck 函数。每当函数返回 true 时(因为 selectedFilters 中的所有属性都匹配候选对象中的相同属性,忽略 selectedFilters 中没有的任何属性),该对象被推入结果数组。

【讨论】:

这很接近,但它似乎不适用于对象检查的两个属性。我明白你对复选框的意思。但在这种情况下,我有多个下拉菜单。因此可以检查多个单选按钮进行过滤。 @phuzisham 哪两个属性?【参考方案3】:

你可以像这样映射对象

const data = [
    name: "Accounting (AAS) | Business, Design & Hospitality Pathway",
    type: "associate of arts",
    method: "clas-s-room based",
    location: "centennial campus",
    pathway: "business, design, & hospitality",
    time: "4 semesters",
    transfer: "transferable"
]

const selectedFilters = 
    type: 'associate of arts',
    transfer: "transferable"


const res = data.reduce((acc, entry) => 
    // for each key in filter check if the value of the entry matches the filter value
    // only do the check if the filter value has not been set to false
    // if all filter values pass push the object, else just return the original array
        return Object
            .keys( selectedFilters )
            .reduce( ( ok, key ) => 
                return ok ? selectedFilters[key] === entry[key] : false;
            , true ) ? acc.concat( entry ) : acc;
    
    , [])

console.log(res);

【讨论】:

以上是关于仅检查两个对象共有的属性。返回具有匹配属性值的每个对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

面向对象

查找是不是在列表中找到具有特定属性值的元素

如何检查两个对象是不是具有相同的一组属性名称?

JavaScript 通过数组过滤并仅基于一个值的匹配返回

C#返回具有匹配属性的对象列表[重复]

干净的方法检查两个对象之间的所有属性(两个除外)是否匹配? [重复]