【问题标题】:Javascript if a value exists in an object?Javascript如果对象中存在值?
【发布时间】:2016-05-08 02:08:01
【问题描述】:

我有一个对象:

var car = {
    company: "Honda",
    year: "2011",
    Model: "Brio"
}

我想知道是否存在继承方法(这是正确的短语吗?)来检查给定对象中是否存在值,有点像x.hasOwnPropertyif (x in car)。或者,我应该自己写。

我已经进行了一些谷歌搜索,但它们都导致 hasOwnProperty 或检查数组中是否存在值。

编辑以取悦 cmets 中的所有人: 我可以想到两个用例在哪里有用:

  1. 检查未定义的键并报告哪个键

    if (!car.isInvalid(car, undefined)) 
        validCarsArray.push (car);
    
  2. 检查对象中是否存在一般用户输入

    var text = searchBox.input; 
    
    validCarArrays.forEach (function (car) {
        if (car.hasOwnValue(car, text)) {
        displayToUserAsResult (car);
        }
    });
    

【问题讨论】:

  • 所以,遍历值并检查一个是否等于它。
  • @zerkms 是的。我只是想知道是否已经有一个现有的方法
  • @CakeToppings 考虑到属性的值可以是原始值、另一个对象或函数,检查值的方法不会很有用。
  • @CakeToppings 您的最后一条评论使您的问题与当前提出的问题大不相同。您想要的是搜索汽车数组(或只是一个对象并检查其键),并检查是否没有 nullundefined 甚至 ''(空字符串)值
  • 你能提供你想要的样本输入和预期输出吗?

标签: javascript node.js object exists


【解决方案1】:

假设我们从

const obj = {foo : "bar"};

检查一个值:

const hasValue = Object.values(obj).includes("bar");

检查属性:

// NOTE: Requires obj.toString() if key is a number
const hasProperty = Object.keys(obj).includes("foo");

多级值:

function hasValueDeep(json, findValue) {
    const values = Object.values(json);
    let hasValue = values.includes(findValue);
    values.forEach(function(value) {
        if (typeof value === "object") {
            hasValue = hasValue || hasValueDeep(value, findValue);
        }
    })
    return hasValue;
}

多级属性:

function hasPropertyDeep(json, findProperty) {
    const keys = Object.keys(json);
    let hasProperty = keys.includes((findProperty).toString());
    keys.forEach(function(key) {
        const value = json[key];
        if (typeof value === "object") {
            hasProperty = hasProperty || hasPropertyDeep(value, findProperty);
        }
    })
    return hasProperty;
}

【讨论】:

    【解决方案2】:

    不,没有在对象上搜索值的内置方法。

    这样做的唯一方法是遍历对象的所有键并检查每个值。使用即使在旧浏览器中也可以使用的技术,您可以这样做:

    function findValue(o, value) {
        for (var prop in o) {
            if (o.hasOwnProperty(prop) && o[prop] === value) {
                return prop;
            }
        }
        return null;
    }
    
    findValue(car, "2011");    // will return "year"
    findValue(car, "2012");    // will return null
    

    注意:这将返回包含搜索值的第一个属性,即使可能有多个匹配的属性。以效率为代价,您可以返回包含所需值的所有属性的数组。

    注意:这使用额外的.hasOwnProperty() 检查来防止任何将可枚举属性添加到Object.prototype 的代码。如果没有这样的代码并且您确定永远不会有,那么可以消除.hasOwnProperty() 检查。

    【讨论】:

    • OP 询问了价值。
    • 我可能遗漏了一些东西,但是如果您遍历对象键,为什么要检查对象是否具有 hasOwnProperty 的键?
    • @CakeToppings - 因为您只寻找“自己的”属性,但for/in 为您提供所有属性,包括继承的属性。您通常不希望搜索来自基础对象的属性,例如“hasOwnProperty”本身,而是只搜索您自己的代码添加到对象的属性。如果需要,您可以删除该额外检查,但通常您希望从这样的搜索中排除继承的属性。
    • @jfriend00 我可能弄错了,但hasOwnValue 不搜索继承吗? [developer.mozilla.org/en/docs/Web/JavaScript/Reference/…(直接与继承属性) 它为hasOwnProperty返回false
    • @CakeToppings - 您的最后一条评论似乎有一些拼写错误并且遗漏了一些东西(对于一个您包含的链接不起作用),您指的是hasOwnValue,我不知道那是什么是。
    【解决方案3】:

    没有内置函数,但可以使用Object.keys()[].some() 完成:

    function hasValue(obj, value) {
      return Object.keys(obj).some((key) => obj[key] == value);
    }
    
    var car = {
      company: "Honda",
      year: "2011",
      Model: "Brio"
    }
    
    snippet.log('car has Honda: ' + hasValue(car, 'Honda'));
    snippet.log('car has NotHonda: ' + hasValue(car, 'NotHonda'));
    <script src="https://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

    【讨论】:

      【解决方案4】:

      此函数使用Object.keys() 并返回一个数组,其中包含具有给定值的对象的键。

      Object.keys() 方法返回给定对象自己的可枚举属性的数组,其顺序与 for ... in 循环提供的顺序相同(不同之处在于 for-in 循环也枚举原型链中的属性)。

      var car = {
          company: "Honda",
          year: "2011",
          Model: "Brio"
      };
      
      function getKeysWithValue(v, o) {
          return Object.keys(o).filter(function (k) {
              return o[k] === v;
          });
      }
      
      document.write('<pre>' + JSON.stringify(getKeysWithValue('Honda', car), 0, 4) + '</pre>');

      【讨论】:

      • 为什么要删除并重新发布新答案?我假设您知道有一个“编辑”功能,您可以简单地编辑您发布的答案。
      • 我知道,但我的用户代理搞混了。
      • 听起来更像是飞行员错误:)。哪个用户代理有“编辑”问题?
      • 您不需要o.hasOwnProperty() 检查,因为Object.keys() 只枚举“自己的”键 - 它不查看继承的键。
      【解决方案5】:

      我用这个函数来检查array2是否包含与array1的共同值。

      const array1 = ['a','b','c','x'];
      const array2 = ['z','y','x'];
      
      
      function ContainsCommonItem3(arr1, arr2){
              return arr1.some(item => arr2.includes(item));
          }
      

      【讨论】:

        猜你喜欢
        • 2020-11-01
        • 1970-01-01
        • 2017-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-15
        • 2021-03-06
        相关资源
        最近更新 更多