[英]Javascript if a value exists in an object?
我有一個對象:
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); } });
假設我們開始
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;
}
不,沒有內置方法來搜索對象上的值。
這樣做的唯一方法是迭代對象的所有鍵並檢查每個值。 使用即使在舊瀏覽器中也能工作的技術,您可以這樣做:
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()
檢查。
該函數使用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>');
沒有內置函數,但可以使用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>
我使用這個函數來檢查 array2 是否包含與 array1 的公共值。
const array1 = ['a','b','c','x'];
const array2 = ['z','y','x'];
function ContainsCommonItem3(arr1, arr2){
return arr1.some(item => arr2.includes(item));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.