Javascript 对象中是否存在值?
Javascript if a value exists in an object?
我得到了一个对象:
var car = {
company: "Honda",
year: "2011",
Model: "Brio"
}
我想知道是否存在一个继承方法(这是正确的短语吗?)来检查给定对象中是否存在值,有点像 x.hasOwnProperty
或 if (x in car)
。或者,我应该自己写。
我已经进行了几次 google 搜索,但它们都指向 hasOwnProperty
或检查某个值是否存在于数组中。
编辑以取悦评论中的所有人:
我能想到这两个用例在哪里有用:
正在检查未定义的键并报告是哪一个
if (!car.isInvalid(car, undefined))
validCarsArray.push (car);
检查对象中是否存在一般用户输入
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));
}
我得到了一个对象:
var car = {
company: "Honda",
year: "2011",
Model: "Brio"
}
我想知道是否存在一个继承方法(这是正确的短语吗?)来检查给定对象中是否存在值,有点像 x.hasOwnProperty
或 if (x in car)
。或者,我应该自己写。
我已经进行了几次 google 搜索,但它们都指向 hasOwnProperty
或检查某个值是否存在于数组中。
编辑以取悦评论中的所有人: 我能想到这两个用例在哪里有用:
正在检查未定义的键并报告是哪一个
if (!car.isInvalid(car, undefined)) validCarsArray.push (car);
检查对象中是否存在一般用户输入
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 afor ... 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));
}