我有一个对象:
var car = {
company: "Honda",
year: "2011",
Model: "Brio"
}
我想知道是否存在一个继承的方法(是正确的短语?)来检查给定对象中是否存在值,有点像x.hasOwnProperty
或if (x in car)
。或者,我应该自己编写。
我已经完成了一些谷歌搜索,但它们都会导致hasOwnProperty
或检查数组中是否存在值。
编辑以取悦评论中的所有人: 有两个用例,我可以想到它有用的地方:
检查未定义的密钥并报告哪一个
if (!car.isInvalid(car, undefined))
validCarsArray.push (car);
检查对象中是否存在一般用户输入
var text = searchBox.input;
validCarArrays.forEach (function (car) {
if (car.hasOwnValue(car, text)) {
displayToUserAsResult (car);
}
});
答案 0 :(得分:3)
我们假设我们从
开始const obj = {foo : "bar"};
const hasValue = Object.values(obj).includes("bar");
const hasProperty = Object.keys(obj).includes("foo");
答案 1 :(得分: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()
检查。
答案 2 :(得分:1)
此函数使用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>');
&#13;
答案 3 :(得分:1)
没有内置功能,但可以使用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'));
&#13;
<script src="https://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
答案 4 :(得分:0)
我使用了此功能,以检查array2是否包含与array1相同的值。
const array1 = ['a','b','c','x'];
const array2 = ['z','y','x'];
function ContainsCommonItem3(arr1, arr2){
return arr1.some(item => arr2.includes(item));
}