Javascript 对象中是否存在值?

Javascript if a value exists in an object?

我得到了一个对象:

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

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

我已经进行了几次 google 搜索,但它们都指向 hasOwnProperty 或检查某个值是否存在于数组中。

编辑以取悦评论中的所有人: 我能想到这两个用例在哪里有用:

  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);
        }
    });
    

此函数使用 Object.keys() 和 returns 数组,其中包含具有给定值的对象的键。

The Object.keys() method returns an array of a given object's own enumerable properties, in the same order as that provided by a for ... in loop (the difference being that a for-in loop enumerates properties in the prototype chain as well).

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>');

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

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

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

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

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

没有内置函数,但可以使用 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>

假设我们从

开始
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;
}

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

const array1 = ['a','b','c','x'];
const array2 = ['z','y','x'];


function ContainsCommonItem3(arr1, arr2){
        return arr1.some(item => arr2.includes(item));
    }