【问题标题】:Is there a .contains method in javascript that works similar to Python's implimentation .__contains__()? - node.jsjavascript 中是否存在类似于 Python 实现 .__contains__() 的 .contains 方法? - 节点.js
【发布时间】:2021-09-23 14:15:59
【问题描述】:

我想知道 JavaScript 中是否有任何 object.contains 方法的暗示,其工作方式类似于 Python 版本 object.__contains__() 的工作方式,因为我希望能够使用嵌套对象扫描整个对象以查看如果存在包含该方法与之比较的内容的键或值。我知道 Javascript 中还有其他方法可以做到这一点,例如使用 filtersome,但它们对我不起作用。

person: {
  name: 'Bob',
  age: 40,
  items: {
    cars: 4,
    house: 1,
    computer: 2
  }
}

我需要扫描整个对象而不仅仅是第一级的东西(这将是nameageitems,如果您搜索cars,您将不会得到任何回应)。

【问题讨论】:

  • 不是 python 专家,但__contains__ 声明“对于映射对象,这应该考虑映射的键而不是值或键项对。”所以你描述的其实不是 contains 的行为对吗?
  • 不太确定,我刚刚看到一个朋友在类似的应用程序中使用它,并认为他的做法是正确的,因为他是一个比我更有经验的编码员..

标签: javascript node.js object contains


【解决方案1】:

我不这么认为。一个天真的想法是

JSON.stringify(target).includes( JSON.stringify( search ) )

如果search 不是字符串,它就不能很好地工作,因为它也会匹配字符串内部。一个非天真的方法是这样的:

const contains = (obj, search) => 
 Object.keys(obj).includes(search) ||
 Object.values(obj).includes(search) ||
 Object.values(obj)
   .filter(it => typeof it === "object" && it !== null)
   .some(it => contains(it, search));

【讨论】:

    【解决方案2】:

    我想这没有标准函数,但您可以肯定地使用 typeofObject.entries() 编写自定义 recursive 函数。

    let person =  {
      name: 'Bob',
      age: 40,
      items: {
        cars: 4,
        house: 1,
        computer: 2
      }
    };
    
    function searchForTerm(obj,item){
      
      for(let [key,val] of Object.entries(obj)){
        if(key == item){
          return true;
        }
        else if(typeof val === 'object')  
         {
           if(searchForTerm(val,item)){
             return true;
           }
         }
        else if(val == item){
          return true;
        }
      }
      return false;
    }
    
    console.log(searchForTerm(person,40));
    console.log(searchForTerm(person,43));
    console.log(searchForTerm(person,'Bob'));
    console.log(searchForTerm(person,'cars'));
    console.log(searchForTerm(person,'truck'));

    我在第一种情况下使用==,所以没有进行类型检查。

    显然,这是一个初学者,您可以根据自己的需要进行修改。但这应该能让你继续前进。

    【讨论】:

      猜你喜欢
      • 2017-06-16
      • 1970-01-01
      • 2016-08-10
      • 2011-12-18
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 2021-09-28
      • 2013-05-08
      相关资源
      最近更新 更多